MySQL:不使用ORDER BY的索引?

时间:2011-07-06 20:32:50

标签: mysql indexing sql-order-by

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

我有一张大桌子(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

2 个答案:

答案 0 :(得分:0)

创建索引后你是否有ANALYZE TABLE?

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

答案 1 :(得分:0)

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