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 都會走