PostgreSQL Index性能調優

Index(索引)這個概念對於不少熟悉關係型數據庫的人來講,不是一個陌生的概念。當表中數據愈來愈多時,在查詢時,爲了不全表查詢(sequence scan)能夠在查詢相關的條件字段上添加索引。舉例來講明index對於查詢效率的影響。首先建立測試表 "sort_test",以下時表建立SQL,能夠發現此表有2個字段id和salary。其中id是主鍵,咱們知道屬於主鍵的字段是默認添加了索引的。sql

CREATE TABLE public.sort_test(    id bigint NOT NULL,    salary numeric NOT NULL,    CONSTRAINT sort_test_pkey PRIMARY KEY (id))
TABLESPACE pg_default;
ALTER TABLE public.sort_test    OWNER to postgres;

以如下SQL查詢語句爲例進行講解,其中查詢字段salary上沒有建立索引。數據庫

select * from public."sort_test" where salary = 101;

那麼此時的執行計劃和執行時間是多少呢,能夠參考下圖,執行計劃是走Parallel Seq Scan,SQL運行時間是 246.71 ms.app

Screen Shot 2020-09-27 at 23.11.35.png


    那麼若是要在salary字段上添加索引呢?建立索引的語句以下:ide

CREATE INDEX index_sort_test_salary    ON public.sort_test USING btree    (salary ASC NULLS LAST)    TABLESPACE pg_default;


       salary應用索引以後的執行計劃如何呢?能夠參考下圖,執行時間爲0.047 ms,執行時間有了大幅度提高,大體提高了5200多倍。因此在大容量表中,查詢時,若是有性能問題,首先要檢查相關的字段有沒有建立或者走索引。測試表的容量是500萬行。post

Screen Shot 2020-09-27 at 23.17.26.png


        若是是小容量的表或者表不會發生不少的查詢操做,反而會有不少的插入/更新操做,那麼此時就要對建立索引這件事慎重了。那麼不少同窗可能會中途接手項目,對於表結構的歷史不是特別熟悉,那麼對於一個很大的項目,表結構可能也比較複雜,那麼應該怎麼去快速定位哪些索引不多用呢?能夠參考以下SQL,如何查詢結果是0,那麼能夠考慮將相關索引刪除。性能

select idx_scan from pg_stat_user_indexes where indexrelname = 'index_sort_test_salary';


       我的的建議是極少用到的索引能夠刪除,留下無用的索引可能會形成其餘類型的操做性能問題,還有就是索引也會佔用磁盤空間的。測試


       你們也能夠掃描並關注以下公衆號「TimTest」,會有更多性能測試相關內容分享。spa

qrcode_for_gh_39009e949117_258-1.jpg

相關文章
相關標籤/搜索