MySql中BETWEEN操作的索引

时间:2010-02-01 06:59:27

标签: mysql indexing

我在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

2 个答案:

答案 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

如果您将索引更改为该并重新运行查询,是否有帮助?