1. 程式人生 > >PostgreSql INDEX 索引總結

PostgreSql INDEX 索引總結

1.建立索引

create index index_name on table_name(field_name1, field_name2,······);

注:預設建立B-tree索引

2.查詢索引

 select * from pg_indexes where tablename ='table_name';

3.刪除索引

drop index index_name;

4.常見需要建立索引情況

a.主鍵自動建立唯一索引;

b.頻繁作為查詢條件的欄位應該建立索引;

c.查詢中與其他表有關聯的欄位,例如外來鍵關係;

d.高併發的情況下一般選擇複合索引;

e.查詢中排序的欄位建立索引將大大提高排序的速度(索引就是排序加快速查詢);

f.查詢中統計或者分組的欄位;

g.儲存空間固定的欄位更適合選作索引的關鍵字,例:與 text 型別的欄位相比, char 型別的欄位較為適合選作索引關鍵字

5.常見無需建立索引情況

a. 頻繁更新的欄位不適合建立索引,因為每次更新不單單是更新記錄,還會更新索引,儲存索引檔案;

b.表記錄太少,不需要建立索引;

c.經常增刪改的表,不需要建立索引;

d.表中包含大量重複資料,不需要建立索引,例如性別欄位,只有男女,不適合建立索引; 

6.常見索引無效情況

a. 沒有查詢條件,或者查詢條件沒有建立索引;

b. 在查詢條件上沒有使用引導列;

c. 查詢的數量是大表的大部分,應該是30%以上;

d. 使用內部函式導致索引失效,例:select * from test where round(id)=10;

e. 表記錄較少

f. 隱式轉換導致索引失效,例如:表的欄位tu_mdn定義為varchar2(20), 但在查詢時把該欄位作為number型別以where條件傳給資料庫:

錯誤的例子:select * from test where tu_mdn=13333333333; 

正確的例子:select * from test where tu_mdn='13333333333'; 

g. 索引列進行運算導致索引失效,運算包括(+,-,*,/,! 等),例:

select * from test where round(id)=10; 

h. like "%_" 百分號在前;

i.單獨引用複合索引裡非第一位置的索引列;

j. B-tree索引 is null不會走,is not null會走,點陣圖索引 is null,is not null 都會走