我遇到大表索引问题。
我有表(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
答案 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
而不需要原始数据。
这些都不是完美的解决方案。