pgsqlはIN()条件の給力に対してサポートします。

1491 ワード

pgsqlのクエリプランナーは、条件をインテリジェントに分解することができるからです。
 
SELECT * FROM tk WHERE tk.id = 1 OR tk.id = 2
プログラムは、索引のあるIDフィールドに対するクエリーを2つにスマートに分解し、UNIONします。
 
INの状況はどうですか?
 
SELECT * FROM tk WHERE tk.id IN (1,2,3)
 
explinの結果は思ったより分解ではなくpgsqlの配列タイプを使って処理されました。
 
Bitmap Heap Scan on tk  (cost=12.77..21.82 rows=3 width=72)
  Recheck Cond: (id = ANY ('{1,2,3}'::integer[]))
  ->  Bitmap Index Scan on tk_pkey  (cost=0.00..12.77 rows=3 width=0)
        Index Cond: (id = ANY ('{1,2,3}'::integer[]))
Time: 0.015s
 
手動分解より効率が高い!
 
SELECT * FROM tk WHERE tk.id = 1 OR tk.id = 2 OR tk.id =3
 
Bitmap Heap Scan on tk  (cost=12.78..21.83 rows=3 width=72)
  Recheck Cond: ((id = 1) OR (id = 2) OR (id = 3))
  ->  BitmapOr  (cost=12.78..12.78 rows=3 width=0)
        ->  Bitmap Index Scan on tk_pkey  (cost=0.00..4.26 rows=1 width=0)
              Index Cond: (id = 1)
        ->  Bitmap Index Scan on tk_pkey  (cost=0.00..4.26 rows=1 width=0)
              Index Cond: (id = 2)
        ->  Bitmap Index Scan on tk_pkey  (cost=0.00..4.26 rows=1 width=0)
              Index Cond: (id = 3)
Time: 0.047s
 
 
mysqlにとって、二つの方法は違いません。その調査の最適化器は知能と強大さがなく、ORさえ分解できないです。だから优化器と言って、企画器ではありません。人の肉で最適化をします。