【问题标题】:MySQL: Not using index for ORDER BY?MySQL:不使用 ORDER BY 的索引?
【发布时间】:2011-09-29 23:05:56
【问题描述】:

我一直在尝试搜索所有内容,但仍然无法弄清楚发生了什么。

我有一张大桌子(100M+行)。其中包括 3 列:user_id、日期、类型。 它有一个索引idx(user_id, type, date)

当我EXPLAIN这个查询时:

  SELECT * 
    FROM table 
   WHERE user_id = 12345 
     AND type = 'X' 
ORDER BY date DESC 
   LIMIT 5

EXPLAIN 显示 MySQL 检查了 110K 行。这大概是这个 user_id 的行数。

我的问题是:

为什么ORDER_BY LIMIT 5 不使用相同的索引?它知道哪些行属于 user_id,日期是同一索引的一部分,那么为什么不只取该索引中的最后 5 行呢?

附:我尝试按 (user_id, date, type) 索引 - 结果相同;我尝试删除 DESC - 结果相同。

这是EXPLAIN 计划:

  id: 1
  select_type: SIMPLE
  table: s
  type: ref
  possible_keys: dateIdx,userTypeDateIdx
  key: userTypeDateIdx
  key_len: 5
  ref: const,const
  rows: 110118
  Extra: Using where

我也尝试添加FORCE INDEX FOR ORDER BY 提示,但我仍然得到rows: 110118

【问题讨论】:

  • 澄清一下,您在 3 列上有一个复合索引,或者每个单独的列都有一个索引。
  • 你能发布完整的解释输出和SHOW CREATE TABLE table 的输出吗?这对诊断问题非常有帮助。
  • 查询执行计划只是显示 MySQL 认为它需要扫描的行数的估计值。这只是一个估计。对于实际数量,使用慢查询日志。您可能还想告诉我们查询所用的时间。

标签: mysql indexing sql-order-by


【解决方案1】:

您是否在创建索引后分析表?

在分析完表之前,Mysql 不会使用索引。最好使用的索引是您使用 (user_id, type, date) 创建的索引

【讨论】:

  • 我分析了表格,但没有帮助。
【解决方案2】:

索引中的日期按升序排列,您要求按日期降序排列最近的五行;它不能为此使用索引。如果您将索引更改为user_id, type, date desc,它将能够使用该索引来获取最近的五行。

【讨论】:

  • 我想过,但是如果我在没有 DESC 的情况下执行相同的查询,它仍然会在 EXPLAIN 计划中显示 100K 行。
猜你喜欢
  • 2012-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多