【发布时间】:2010-02-01 06:59:26
【问题描述】:
我在 MySQL 中有几个表,其中存储了按时间顺序排列的数据。我在最后添加了包含日期字段的表的覆盖索引。在我的查询中,我使用日期字段的 BETWEEN 操作来选择一段时间的数据。所以我的 WHERE 语句由覆盖索引的所有字段组成。
当我在 Extra 列中执行 EXPLAIN 查询时,我有“Using where” - 所以,我认为,这意味着该日期字段不在索引中搜索。当我选择一个时期的数据时 - 我使用“=”操作而不是 BETWEEN 并且“使用 where”没有出现 - 全部在索引中搜索。
对于所有要在索引中搜索的包含 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
【问题讨论】:
-
您是否检查过如果您使用 >= 和
-
我试图只用一个 > 操作来执行查询,情况没有改变。 i;, 使用 mysql 5.1 服务器
-
粘贴涉及的表的整个架构、查询和解释计划。 BETWEEN 应该能够对以相关字段开头的索引进行范围扫描,除非优化器认为有更好的方法。