索引是對數(shù)據(jù)庫中一列或幾列的數(shù)據(jù)按照特定的數(shù)據(jù)結(jié)構(gòu)進行排序保存的一種方式。使用索引可以加快數(shù)據(jù)庫查詢或排序時的速度稳摄。如果不使用索引那么查詢數(shù)據(jù)時就會進行全表掃描也就是每條數(shù)據(jù)讀取一遍看是不是要找的值,而使用索引可以快速找到要找的數(shù)據(jù),不用掃描所有數(shù)據(jù)踪区。
- 索引的優(yōu)點:
可以大大提高數(shù)據(jù)查詢的速度
在實現(xiàn)數(shù)據(jù)的參考完整性方面,可以加快表和表之間的連接
在分組和排序時吊骤,可以減少分組和排序的時間
當(dāng)然,索引也有缺點静尼,所以我們不能在表中隨意的創(chuàng)建索引
索引的缺點
創(chuàng)建和維護索引需要耗費時間白粉,數(shù)據(jù)量越大耗費時間也越長
索引需要占用額外的磁盤空間,如果數(shù)據(jù)量很大又有大量索引鼠渺,那么索引文件大小增加很快
對表中數(shù)據(jù)改動的時候鸭巴,索引需要動態(tài)維護,降低了數(shù)據(jù)操作的速度索引類型
PostgreSQL提供的索引類型有: B-tree拦盹、Hash鹃祖、GiST和GIN。大多數(shù)情況下普舆,我們使用比較常用的B-tree索引恬口。
- B-tree索引適合處理那么些能夠按照順序存儲的數(shù)據(jù),它適合用于比較操作時經(jīng)常用到的字段沼侣。
- Hash索引只能處理簡單的等于比較祖能。當(dāng)一個字段涉及到使用“=”操作符進行比較時查詢規(guī)劃器會考慮使用Hash索引。
- GiST索引不只是一種索引蛾洛,還是一種架構(gòu)养铸,可以實現(xiàn)很多不同的索引策略。所以,GiST索引可以使用的特定操作符類型高度依賴于索引策略(操作符類)钞螟。
- GIN索引是反轉(zhuǎn)索引兔甘,它可以處理包含多個鍵的值(比如數(shù)組)。和GiST索引類似鳞滨,GIN支持用戶定義的索引策略洞焙,GIN索引可以使用的特定操作符類型根據(jù)索引策略不同而不同。
- 創(chuàng)建太援、刪除索引
create index idx_name on table_name(column_name); #創(chuàng)建B-tree索引
create index idx_name on table_name using hash (column_name); #創(chuàng)建Hash索引
drop index idx_name; #刪除索引
- 索引的設(shè)計原則
1闽晦、索引并不是越多越好,索引太多會影響insert,delete,update的性能提岔。
2仙蛉、對于經(jīng)常查詢的字段應(yīng)該建立索引
3、避免對經(jīng)常更新的表進行過多的索引
4碱蒙、數(shù)據(jù)量很小的表最好不要使用索引荠瘪,由于數(shù)據(jù)量少,掃描表的時間可能比查詢索引時間要短赛惩,索引沒有效果
5哀墓、不要在不同值少的列上建立索引,例如 表示性別的字段一般只有 ‘男’和‘女’兩個不同值喷兼,如果建立索引會嚴(yán)重降低更新速度篮绰。
6、在頻繁進行排序或分組的列上建立索引時季惯,如果待排序的列有多個吠各,可在這些列上建立聯(lián)合索引。