postgresql , 不等于 , 索引 , 外連接配接
在資料庫中不等于能不能走索引呢?理論上是不行的,但是有方法可以讓不等于也走索引(雖然走索引也不一定好)。
比如使用外連接配接實作(需要表有pk才行,沒有pk可以使用行号代替),或者使用not exists,或者使用partial index(不支援變量)。
對于傳回結果集很大的場景,建議使用遊标分頁傳回,此時可能用全表掃描更适合。
原始方法,不能走索引
select * from tbl_pk where c1 <> 1;
postgres=# explain (analyze,verbose,timing,costs,buffers) select * from tbl_pk where c1 <> 1;
seq scan on public.tbl_pk (cost=0.00..16925.00 rows=999902 width=8) (actual time=0.020..182.603 rows=999919 loops=1)
output: id, c1
filter: (tbl_pk.c1 <> 1)
rows removed by filter: 81
buffers: shared hit=4425
planning time: 0.486 ms
execution time: 249.335 ms
(7 rows)
讓他走索引的寫法
沒有pk時,可以使用行号進行關聯。