繁体   English   中英

MySql中BETWEEN操作的索引

[英]Index for BETWEEN operation in MySql

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

你有几行? 有时,如果优化器认为不必要,则不使用索引(例如,如果表中的行数非常小)。 你能告诉我们你的SQL是什么样的吗?

您可以尝试暗示您的索引使用情况并查看您在EXPLAIN获得的内容,只是为了确认您的索引被忽略,例如

http://dev.mysql.com/doc/refman/5.1/en/optimizer-issues.html

如果你是通过id_phone进行GROUPing,那么一个更有用的索引就是从那个开始的索引

... PRIMARY KEY (id_phone, id_site, `group`, day) USING BTREE

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM