我在MySQL中有几个表存储了按时间顺序排列的数据。我在这个表中添加了覆盖索引,最后是日期字段。在我的查询中,我使用BETWEEN操作日期字段选择一段时间的数据。所以我的WHERE语句包含覆盖索引的所有字段。
当我在Extra栏中执行EXPLAIN查询时,我有“使用位置” - 所以,我认为,这意味着,该日期字段不会在索引中搜索。当我选择一个时期的数据时 - 我正在使用“=”操作而不是BETWEEN和“使用地点”没有出现 - 所有都在索引中搜索。
我能做什么,在索引中搜索包含BETWEEN操作的所有WHERE语句?
更新:
表格结构:
CREATE TABLE phones_stat (
id_site int(10) unsigned NOT NULL,
group smallint(5) unsigned NOT NULL,
day date NOT NULL,
id_phone mediumint(8) unsigned NOT NULL,
sessions int(10) unsigned NOT NULL,
PRIMARY KEY (id_site,group,day,id_phone) USING BTREE
) ;
查询:
SELECT id_phone,
SUM(sessions) AS cnt
FROM phones_stat
WHERE id_site = 25
AND group = 1
AND day BETWEEN '2010-01-01' AND '2010-01-31'
GROUP BY id_phone
ORDER BY cnt DESC
答案 0 :(得分:2)
你有几行?有时,如果优化器认为不必要,则不使用索引(例如,如果表中的行数非常小)。你能告诉我们你的SQL是什么样的吗?
您可以尝试暗示您的索引使用情况并查看EXPLAIN
中的内容,以确认您的索引被忽略,例如
http://dev.mysql.com/doc/refman/5.1/en/optimizer-issues.html
答案 1 :(得分:0)
如果你是通过id_phone进行分组,那么一个更有用的索引将是从那个开始的索引,即
... PRIMARY KEY (id_phone, id_site, `group`, day) USING BTREE
如果您将索引更改为该并重新运行查询,是否有帮助?