クエリを最適化しようとしています。
私の質問はMySQL、Union ALL、LIMITに似ているようで、答えは同じかもしれません(恐れています)。ただし、私の場合は、より厳しい制限 (1) と日時列のインデックスがあります。
だからここに行きます:
簡単にするために、3 つの列を持つ 1 つのテーブルだけにしましょう。
- md5 (varchar)
- 値 (varchar)。
- 最終更新日 (日時)
(md5, updated) にインデックスがあるため、md5 キーを選択し、更新された順序で並べ替え、1 に制限すると最適化されます。
検索では、10 個の md5 キーの 1 つに一致する最大 1 つのレコードが返されます。キーには優先順位があります。したがって、prio 1 のレコードがある場合、prio 2、3 などのレコードよりも優先されます。
現在、UNION ALL が使用されています。
select * from
(
(
select 0 prio, value
from mytable
where md5 = '7b76e7c87e1e697d08300fd9058ed1db'
order by lastupdated desc
limit 1
)
union all
(
select 1 prio, value
from mytable
where md5 = 'eb36cd1c563ffedc6adaf8b74c259723'
order by lastupdated desc
limit 1
)
) x
order by prio
limit 1;
それは機能しますが、10 個のキーが提供された場合、UNION は 10 個のクエリすべてを実行するようです。
ただし、ビジネスの観点からは、select を順番に実行し、最初の一致後に停止しても問題ありません。
それはプレーンSQLで可能ですか?
それとも、唯一のオプションはストアド プロシージャでしょうか。