【问题标题】:Index for BETWEEN operation in MySqlMySql 中 BETWEEN 操作的索引
【发布时间】: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 应该能够对以相关字段开头的索引进行范围扫描,除非优化器认为有更好的方法。

标签: mysql indexing


【解决方案1】:

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

您可以尝试提示您的索引使用情况并查看您在 EXPLAIN 中得到的信息,以确认您的索引被忽略,例如

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

【讨论】:

  • 我的索引被使用了,但不是全部,它被覆盖了——所以它由三个字段组成,最后是日期字段。
【解决方案2】:

如果您按 id_phone 进行分组,那么更有用的索引将以该索引开头,即

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-05
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 2014-09-25
    • 1970-01-01
    相关资源
    最近更新 更多