我正在从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);
非常感谢。
答案 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