MySql索引的where和order by子句

时间:2015-03-25 10:03:25

标签: mysql

我遇到大表索引问题。

我有表(id,external_item_id,time_stamp,status_id);

这3个查询的最佳索引是什么:

 SELECT *
 FROM items pi
 WHERE 1=1 AND external_item_id IN (1154,1155,1163,3660,6801,98)
 ORDER BY pi.time_stamp DESC, pi.id DESC
 LIMIT 12


 SELECT *
 FROM items pi
 WHERE 1=1 AND external_item_id IN (1154,1155,1163,3660,6801,98) AND status_id < 20
 ORDER BY pi.time_stamp DESC, pi.id DESC
 LIMIT 12

 SELECT *
 FROM items pi
 WHERE 1=1 AND external_item_id IN (1154,1155,1163,3660,6801,98) AND pi.time_stamp <= 13434534452 AND id < 1600
 ORDER BY pi.time_stamp DESC, pi.id DESC
 LIMIT 12

1 个答案:

答案 0 :(得分:0)

由于in的项目列表,很难优化此查询。

引擎基本上可以采用两种方法来进行这些查询。使用where子句的索引。然后进行排序或使用oder by的索引。由于where中存在不等式(in是&#34;不等式&#34;),因此索引无法直接用于where

where的最佳索引是:items(external_item_id, status_id)items(external_item_id, time_stamp)

另一种执行计划是使用order by的索引,然后即时过滤。这表示尝试:items(time_stamp, id, external_item_id, status_id)。最后两列是索引可以满足where而不需要原始数据。

这些都不是完美的解决方案。