前言
非常有幸通過(guò)了支付寶的一輪電面式散,面試官對(duì)我評(píng)價(jià)較高,題目中設(shè)計(jì)到了參數(shù)集合漓滔、數(shù)據(jù)庫(kù)優(yōu)化乖篷、索引、線程池撕蔼、鎖鲸沮、反射等問(wèn)題。但是對(duì)于索引的原理是我知之甚少的讼溺,但是非常感謝支付寶面試官對(duì)我的引導(dǎo),讓我順利過(guò)關(guān)炫狱,但是該掌握的知識(shí)不能放手,現(xiàn)在來(lái)整理數(shù)據(jù)庫(kù)-索引的相關(guān)知識(shí)及原理嬉荆。
什么是索引酷含?
舉個(gè)栗子,我們拿出一本新華字典蝶锋,它的目錄實(shí)際上就是一種索引:非聚集索引什往。我們可以通過(guò)目錄迅速定位我們要查的字。而字典的內(nèi)容部分一般都是按照拼音排序的躯舔,這實(shí)際上又是一種索引:聚集索引省古。
更加具體的內(nèi)容請(qǐng)移步百度百科:索引-百度百科資料
索引的分類
- 聚集索引
- 非聚集索引
- 哈希索引
- B+-樹索引(二分查找)
索引有什么作用
在數(shù)據(jù)庫(kù)系統(tǒng)中建立索引主要有以下作用:
- 快速取數(shù)據(jù);
- 保證數(shù)據(jù)記錄的唯一性惜互;
- 實(shí)現(xiàn)表與表之間的參照完整性琳拭;
- 在使用 ORDER BY、GROUP BY 子句進(jìn)行數(shù)據(jù)檢索時(shí)坑鱼,利用索引可以減少排序和分組的時(shí)間絮缅。
索引有什么優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 大大加快數(shù)據(jù)的檢索速度;
- 創(chuàng)建唯一性索引,保證數(shù)據(jù)庫(kù)表中每一行數(shù)據(jù)的唯一性;
- 加速表和表之間的連接;
- 在使用分組和排序子句進(jìn)行數(shù)據(jù)檢索時(shí)画恰,可以顯著減少查詢中分組和排序的時(shí)間吸奴。
缺點(diǎn)
- 索引需要占物理空間马靠。
- 當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加蔼两、刪除和修改的時(shí)候额划,索引也要?jiǎng)討B(tài)的維護(hù)档泽,降低了數(shù)據(jù)的維護(hù)速度。
什么時(shí)候使用索引
如果某個(gè)字段馆匿,或一組字段會(huì)出現(xiàn)在一個(gè)會(huì)被頻繁調(diào)用的 WHERE 子句中渐北,那么它們應(yīng)該是被索引的,這樣會(huì)更快的得到結(jié)果恃锉。為了避免意外的發(fā)生呕臂,需要恰當(dāng)?shù)厥褂梦ㄒ凰饕⑶椅覀€(gè)人不推薦使用全文索引歧蒋,尤其對(duì)于漢字來(lái)說(shuō)谜洽,全文索引的開銷太大了,得不償失阐虚。
索引至少會(huì)帶來(lái)如下的overhead額外的創(chuàng)建時(shí)間額外的存儲(chǔ)空間(單列索引占原表5%至15%空間敌呈,想象一下如果為一個(gè)表創(chuàng)建三四個(gè)索引)額外的維護(hù)時(shí)間這一切只為了一個(gè)目的:減少在small range query的情況下的query time。如果是大range query 返回1%以上的數(shù)據(jù)吭练,這情況下索引的意義不大析显。
選擇什么索引
- low selectivity 情況下: 比如 parent column 為性別,bitmap index什么的可以考慮分尸。
- high selectivity 可以用 btree 來(lái)維持二分查找的查找效率
寫在最后
到現(xiàn)在,你應(yīng)該對(duì)索引有一個(gè)具體的認(rèn)識(shí)和運(yùn)用的體會(huì)箩绍,凡事有得必有失材蛛,而使用的利弊權(quán)衡必須有實(shí)際的操作才有發(fā)言的自由,所以卑吭,在這篇文章之后豆赏,自行到數(shù)據(jù)庫(kù)進(jìn)行一次十萬(wàn)級(jí)數(shù)據(jù)有索引和無(wú)索引的練習(xí)吧,祝生活更好己单!