两个日期之间的mysql索引

时间:2011-09-28 10:47:17

标签: php mysql indexing

我正在从mysql数据库表中选择数据。 当我搜索特定日期时,我的索引很好。 当我在两个日期之间搜索数据时索引不起作用并且查询需要很长时间。 有谁知道如何改进查询或索引?

查询A:

EXPLAIN SELECT * FROM sal_import  
WHERE dateStats>="2011-07-28" AND dateStats<="2011-07-30" GROUP BY f_shop


id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  i   range   dateStats   dateStats   3   (NULL)  7896    Using where; Using temporary; Using filesort

查询B:

EXPLAIN SELECT * FROM sal_import i 
WHERE dateStats="2011-07-30" GROUP BY f_shop


id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  i   ref dateStats   dateStats   3   const   2182    Using where

这是表格的索引:

ALTER TABLE sal_import ADD INDEX(dateStats,f_shop);

非常感谢。

2 个答案:

答案 0 :(得分:1)

试试这个:

SELECT * FROM sal_import WHERE dateStats BETWEEN '2011-07-28' AND '2011-07-30'

另见http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

答案 1 :(得分:0)

原因是日期索引是非群集的,因此数据不是由磁盘上的该键按顺序排序的。您的表具有少量记录,因此查询优化器已决定进行全表扫描更快,而不是使用二级索引并将记录拼凑在一起。

一个表只能有一个聚簇索引,而通常是主键。日期列通常是放置聚簇索引的有效且合理的列,但它可能不是最佳用途;这实际上取决于该表的使用方式。

http://msdn.microsoft.com/en-us/library/aa933131(v=sql.80).aspx

不幸的是,在MySQL中,聚簇索引必须位于唯一列上,并且您无法在列上定义聚簇索引(显然);数据库默认为您选择该索引。鉴于此,你可能不会对此感到幸运。

http://dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html