索引是對數(shù)據(jù)庫中一列或幾列的數(shù)據(jù)按照特定的數(shù)據(jù)結(jié)構(gòu)進(jìn)行排序保存的一種方式。使用索引可以加快數(shù)據(jù)庫查詢或排序時(shí)的速度。如果不使用索引那么查詢數(shù)據(jù)時(shí)就會進(jìn)行全表掃描也就是每條數(shù)據(jù)讀取一遍看是不是要找的值,而使用索引可以快速找到要找的數(shù)據(jù),不用掃描所有數(shù)據(jù)。
索引的優(yōu)點(diǎn):
可以大大提高數(shù)據(jù)查詢的速度
在實(shí)現(xiàn)數(shù)據(jù)的參考完整性方面,可以加快表和表之間的連接
在分組和排序時(shí),可以減少分組和排序的時(shí)間
當(dāng)然,索引也有缺點(diǎn),所以我們不能在表中隨意的創(chuàng)建索引索引的缺點(diǎn)
創(chuàng)建和維護(hù)索引需要耗費(fèi)時(shí)間,數(shù)據(jù)量越大耗費(fèi)時(shí)間也越長
索引需要占用額外的磁盤空間,如果數(shù)據(jù)量很大又有大量索引,那么索引文件大小增加很快
對表中數(shù)據(jù)改動的時(shí)候,索引需要動態(tài)維護(hù),降低了數(shù)據(jù)操作的速度索引類型
PostgreSQL提供的索引類型有: B-tree、Hash、GiST和GIN。大多數(shù)情況下,我們使用比較常用的B-tree索引。
- B-tree索引適合處理那么些能夠按照順序存儲的數(shù)據(jù),它適合用于比較操作時(shí)經(jīng)常用到的字段。
- Hash索引只能處理簡單的等于比較。當(dāng)一個(gè)字段涉及到使用“=”操作符進(jìn)行比較時(shí)查詢規(guī)劃器會考慮使用Hash索引。
- GiST索引不只是一種索引,還是一種架構(gòu),可以實(shí)現(xiàn)很多不同的索引策略。所以,GiST索引可以使用的特定操作符類型高度依賴于索引策略(操作符類)。
- GIN索引是反轉(zhuǎn)索引,它可以處理包含多個(gè)鍵的值(比如數(shù)組)。和GiST索引類似,GIN支持用戶定義的索引策略,GIN索引可以使用的特定操作符類型根據(jù)索引策略不同而不同。
- 創(chuàng)建、刪除索引
create index idx_name on table_name(column_name); #默認(rèn)創(chuàng)建B-tree索引 (單字段索引)
create index idx_name on table_name(column_name1,column_name2); #默認(rèn)創(chuàng)建B-tree索引 (組合索引)
create index idx_name on table_name using hash (column_name); #創(chuàng)建Hash索引
drop index idx_name; #刪除索引
以上命令 postgresql 、oracle 通用
- 索引的設(shè)計(jì)原則
1、索引并不是越多越好,索引太多會影響insert,delete,update的性能。
2、對于經(jīng)常查詢的字段應(yīng)該建立索引
3、避免對經(jīng)常更新的表進(jìn)行過多的索引
4、數(shù)據(jù)量很小的表最好不要使用索引,由于數(shù)據(jù)量少,掃描表的時(shí)間可能比查詢索引時(shí)間要短,索引沒有效果
5、不要在不同值少的列上建立索引,例如 表示性別的字段一般只有 ‘男’和‘女’兩個(gè)不同值,如果建立索引會嚴(yán)重降低更新速度。
6、在頻繁進(jìn)行排序或分組的列上建立索引時(shí),如果待排序的列有多個(gè),可在這些列上建立聯(lián)合索引。
參考:
PostgreSQL學(xué)習(xí)筆記(六)索引
PostgreSQL 索引
MySQL BTree索引和hash索引的區(qū)別
數(shù)據(jù)庫中主鍵與索引的區(qū)別