【发布时间】: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