數(shù)據(jù)庫(kù)索引:提升效率的利器,還是性能的殺手?
索引 (Index) 是數(shù)據(jù)庫(kù)系統(tǒng)中用于加速數(shù)據(jù)檢索的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)。 簡(jiǎn)單來(lái)說(shuō),索引就像書籍的目錄,它幫助數(shù)據(jù)庫(kù)快速定位所需數(shù)據(jù),避免全表掃描。
索引的本質(zhì)是一種特殊的數(shù)據(jù)結(jié)構(gòu),它以某種方式引用(指向)數(shù)據(jù)庫(kù)中的實(shí)際數(shù)據(jù),從而支持高效的查找算法。 你可以把它想象成一個(gè)“預(yù)先排序好的數(shù)據(jù)結(jié)構(gòu)”,例如查找樹。
- 提升檢索效率: 如同圖書館的書目索引,索引顯著減少數(shù)據(jù)庫(kù)的 I/O 操作,加快數(shù)據(jù)查找速度。
- 降低排序成本: 索引對(duì)數(shù)據(jù)進(jìn)行預(yù)排序,減少了查詢時(shí)排序的計(jì)算量,從而降低了 CPU 消耗。
- 占用存儲(chǔ)空間: 索引本身也是一張表,存儲(chǔ)主鍵和索引字段及其指向?qū)嶓w表記錄的指針,因此會(huì)額外占用磁盤空間。
- 降低更新速度: 索引的維護(hù)會(huì)增加 INSERT、UPDATE、delete 操作的開銷,因?yàn)槊看螖?shù)據(jù)修改都需要同步更新索引。
- 單值索引: 基于單個(gè)列創(chuàng)建的索引。
- 唯一索引: 索引列的值必須唯一(允許空值),主鍵是一種特殊的唯一索引(不允許空值)。
- 復(fù)合索引: 基于多個(gè)列創(chuàng)建的索引。
- 全文索引: 用于在文本列中進(jìn)行全文檢索(僅 MyISAM 支持)。
- 空間索引: 用于處理空間數(shù)據(jù)(例如 GIS 系統(tǒng))。
不同的數(shù)據(jù)庫(kù)存儲(chǔ)引擎支持不同的索引結(jié)構(gòu):
- B-Tree: 最常用的索引結(jié)構(gòu),支持多種比較運(yùn)算符(>, >=, =,
- Hash: 基于哈希表的索引結(jié)構(gòu)(MEMORY 引擎默認(rèn))。
- R-Tree: 用于空間索引。
- 頻繁用作查詢條件的字段。
- 與其他表關(guān)聯(lián)的外鍵字段。
- 查詢中排序或分組的字段。
- 主鍵字段(自動(dòng)創(chuàng)建唯一索引)。
- 表記錄數(shù)量很少。
- 頻繁進(jìn)行增刪改操作的表。
- 數(shù)據(jù)重復(fù)且分布均勻的字段。
對(duì)于復(fù)合索引,數(shù)據(jù)庫(kù)通常遵循“最左前綴匹配原則”。 這意味著,只有當(dāng)查詢條件包含復(fù)合索引的最左列時(shí),才能有效利用該索引。 請(qǐng)參考以下示例和解釋:
表結(jié)構(gòu) (三個(gè)字段:id, name, cid):
CREATE TABLE student ( id INT PRIMARY KEY, name VARCHAR(255), cid INT, KEY name_cid_INX (name, cid) );
查詢示例及解釋(摘自知乎,如有侵權(quán)請(qǐng)聯(lián)系刪除):
CREATE TABLE tbl_name ( Column_def1, Column_def2, Column_def3, ... INDEX index_name (index_col_name, ...) );
CREATE INDEX index_name ON tbl_name (index_col_name, ...);
(此處應(yīng)補(bǔ)充更多關(guān)于創(chuàng)建索引語(yǔ)法的細(xì)節(jié),例如 UNIQUE 索引,F(xiàn)ULLTEXT 索引等)
(唯一索引的說(shuō)明)
請(qǐng)注意,以上內(nèi)容是對(duì)原文的改寫和補(bǔ)充,旨在更清晰地表達(dá)文章的核心內(nèi)容,并對(duì)部分內(nèi)容進(jìn)行了更詳細(xì)的解釋。 圖片鏈接需要替換為實(shí)際的圖片鏈接。