索引是把雙刃劍李皇,一方面喇完,合理的索引可以大大提高數據庫查詢數據的效率;另一方面碎连,索引也會增加數據庫的管理負擔搞动。所以躏精,如何使用索引是一件并不容易的事,我們需要根據實際場景決定使用什么樣的索引鹦肿。
簡介
我們在數據庫的使用中經常會遇到這種場景矗烛,查詢一個有大量數據的表但返回結果只有一行數據或者幾行數據,而不是要求返回全部結果箩溃。如果這個表沒有索引瞭吃,這條查詢語句就會遍歷整個表,然后查出需要的數據涣旨,這樣效率太低歪架。索引的建立相當于建立了一個目錄,通過索引可以直接查詢出需要的那幾條數據霹陡,而不需要遍歷全部數據和蚪。
使用
瀚高數據庫提供多種索引的建立止状, B-tree、Hash攒霹、GiST怯疤、SP-GiST 、GIN 和 BRIN催束,每一種索引類型使用了一種不同的算法來適應不同類型的查詢集峦。這里我們重點說一下最常用的B-tree索引的建立。
一個索引可以定義在表的多個列上面泣崩,最多可以指定32個列(該限制可以在源代碼文件pg_config_manual.h中修改少梁,但是修改后需要重新編譯PostgreSQL)。
例如:
create table test(
id integer,
name text,
sex char
)
create index testIndex on test(id,name);
當執(zhí)行:select * from test where id=' ' and name = ' ' 時矫付,此索引便會生效凯沪。而查詢select * from test where id=' ' or name = ' '則不會生效。
PostgreSQL會自動為定義了一個唯一約束或主鍵的表創(chuàng)建一個唯一索引买优。
一個索引在每一個索引列上只能支持一種排序規(guī)則妨马。如果需要多種排序規(guī)則,你可能需要多個索引杀赢。
例如:
CREATE TABLE test1c (
id integer,
content varchar COLLATE "x"
);
CREATE INDEX test1c_content_index ON test1c (content);
當執(zhí)行SELECT * FROM test1c WHERE content > constant;時烘跺,上述索引將會加速查詢。但對于有些查詢條件脂崔,該索引則無效滤淳,比如下面這個查詢:
SELECT * FROM test1c WHERE content > constant COLLATE "y";
可以新建一個對應的索引來提高查詢效率:
CREATE INDEX test1c_content_y_index ON test1c (content COLLATE "y");