ORDER BY句とLIMIT句で照会結果が限定されている場合に、調べられるレコードを減らす方法

ORDER BY句とLIMIT句が使われている場合には、

ORDER BY句の列にインデックスを定義すれば、調べられるレコードを減らす事ができます。

 

例えば、

SELECT t.owner_id, t.parent_id, t.timeline_type, t.update_date
FROM eip_t_timeline t
WHERE t.parent_id = 0 
AND (t.owner_id IN (0,13,7,16,15,19,18,4,17,21,22,23,24,25,35,38,41,44,51,65,66,67,69,74,82,88,89,90,91,92)) 
ORDER BY t.update_date DESC LIMIT 20 OFFSET 0;

のようなクエリではupdate_dateを順に調べていけば、調べるレコードが少なくて済みそうです。

update_dateのインデックスを定義するコードは次の通りです。

CREATE INDEX eip_t_timeline_update_date_index ON eip_t_timeline(update_date);

オプティマイザが上手く働かない場合には、FROM句の後に、USE句やFORCE句で使うインデックスを指定します。

SELECT t.owner_id, t.parent_id, t.timeline_type, t.update_date
FROM eip_t_timeline t FORCE INDEX(eip_t_timeline_update_date_index)
WHERE t.parent_id = 0 
AND (t.owner_id IN (0,13,7,16,15,19,18,4,17,21,22,23,24,25,35,38,41,44,51,65,66,67,69,74,82,88,89,90,91,92)) 
ORDER BY t.update_date DESC LIMIT 20 OFFSET 0;