173

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

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

我正在努力让我的数据库运行良好并且查询运行顺利

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

4

2 回答 2

202

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

于 2013-03-15T05:22:06.163 回答
21

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

于 2013-03-15T05:30:30.040 回答