2013-03-15 71 views
80

我正在设计一个大型数据库。在我的应用程序中,我将有很多行,例如,我现在有一个包含400万条记录的表。我的大多数查询都使用datetime子句来选择数据。在mysql数据库中索引datetime字段是个好主意吗?在mysql中索引datetime字段是个好主意吗?

Select field1, field2,.....,field15 
from table where field 20 between now() and now + 30 days 

我想保持我的数据库工作良好,正在顺利运行查询

更多,你认为什么想法,我应该创造一个高效率的数据库?

回答

102

MySQL的建议使用索引的原因有多种,包括条件之间消除行:http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

这使你的datetime列一个很好的候选索引,如果你将要在条件经常用它查询。如果您的唯一条件是BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 30 DAY),并且您没有其他索引条件,则MySQL将必须在每个查询上执行全表扫描。我不确定在30天内生成了多少行,但只要不到总行数的1/3,在列上使用索引效率会更高。

有关创建高效数据库的问题非常广泛。我会说要确保它已经规范化并且所有适当的列都被索引(即在连接和where子句中使用的列)。

+3

谢谢你的解释。这真的有帮助。我相信我会有更多的过滤器。我只是想确保索引日期时间字段是一个好主意或不是,因为我们可能有重复的日期时间。但你的答案解释了它:)谢谢 – Jaylen 2013-03-17 00:49:43

+3

+ 1为“在连接和where子句中使用的”。索引策略的一个很好的经验法则。我现在明白了,但在 – 2014-01-31 11:16:01

7

Here作者执行的测试显示整数unix时间戳比DateTime更好。请注意,他使用了MySql。但我觉得不管你用什么数据库引擎比较整数比比较日期稍快,所以int index比DateTime索引好。取T1 - 比较2个日期的时间,T2 - 比较2个整数的时间。在索引字段上搜索大约需要O(log(rows))时间,因为基于某些平衡树的索引 - 对于不同的数据库引擎可能会不同,但无论如何,Log(行)是常用估计。 (如果你不使用位掩码或基于r-tree的索引)。所以区别在于(T2-T1)*日志(行) - 如果您经常执行查询,可能会发挥作用。

+0

之前我没有想过谢谢。我正在考虑作为一种选择,但不知道如何处理它。我相信你是绝对正确的整数总是更快。 – Jaylen 2013-03-17 00:47:44

+26

更好?我怀疑一个unix时间戳对于所有情况都更好。是的,存储一个整数通常比存储一个字符串更快,但是所有的[DateTime函数](http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html )MySQL公开?自己实施它们会对性能或功能产生负面影响。 – Greg 2013-09-26 12:13:21

相关问题