SELECT * FROM table1
WHERE (col1, col2) IN (($1, $2), ($3, $4))
ORDER BY col3
LIMIT 10;
の出力EXPLAIN ANALYZE
:
Limit (cost=59174.75..59174.77 rows=10 width=113) (actual time=3632.627..3632.661 rows=10 loops=1)
-> Sort (cost=59174.75..59180.22 rows=2188 width=113) (actual time=3632.623..3632.634 rows=10 loops=1)
Sort Key: col3
Sort Method: top-N heapsort Memory: 27kB
-> Nested Loop (cost=2.62..59127.46 rows=2188 width=113) (actual time=0.234..3561.309 rows=38347 loops=1)
...........
Total runtime: 3632.818 ms
しかし、注文を削除すると:
SELECT * FROM table1 WHERE (col1, col2) IN (($1, $2), ($3, $4)) LIMIT 10;
Limit (cost=2.62..272.85 rows=10 width=105) (actual time=0.258..1.143 rows=10 loops=1)
-> Nested Loop (cost=2.62..59127.46 rows=2188 width=105) (actual time=0.255..1.115 rows=10 loops=1)
........
Total runtime: 1.306 ms
- コンポジット
btree index on (col1, col2)
と がありbtree index on col3
ます。 - 書き込みパフォーマンスとストレージは優先事項ではありません。読み取りパフォーマンスは最も重要であり、可能な限り高速である必要があります。
- これは、IN 句を使用したクエリをサポートできる必要があります:
WHERE (col1, col2) IN (($1, $2), ($3, $4)) ORDER BY col3 LIMIT 10;
。(ルックアップは常に IN 句を使用してから順序付けます。)
注: (col1、col2、col3) にインデックスを作成することは可能ですか? それは使用(col1, col2)
して検索し、col3
すでに注文しています...