在mysql中索引datetime字段是个好主意吗?

时间:2013-03-15 05:14:00

标签: mysql indexing

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

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

我正在努力保持数据库正常运行并使查询顺利运行

更多,您认为我应该创建高效数据库的想法是什么?

2 个答案:

答案 0 :(得分:126)

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子句中使用的列)。

答案 1 :(得分:15)

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