我一直在尝试并搜索所有内容,但仍无法弄清楚发生了什么。
我有一张大桌子(100M +行)。其中有3列:user_id,date,type。
它有一个索引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,date是同一索引的一部分,那么为什么不直接占用该索引中的最后5行呢?
P.S。我试过索引(user_id,日期,类型) - 相同的结果;我尝试删除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
。
答案 0 :(得分:0)
创建索引后你是否有ANALYZE TABLE?
在分析表之前,Mysql不会使用索引。要使用的最佳索引是您创建的索引(user_id,type,date)
答案 1 :(得分:0)
索引中的日期是按升序排列的,您要求按日期降序排列最近的五行;它不能使用索引。如果您将索引更改为user_id, type, date desc
,则可以使用索引获取最近的五行。