前言
非常有幸通過了支付寶的一輪電面,面試官對我評價較高,題目中設(shè)計到了參數(shù)集合、數(shù)據(jù)庫優(yōu)化、索引、線程池、鎖、反射等問題。但是對于索引的原理是我知之甚少的,但是非常感謝支付寶面試官對我的引導(dǎo),讓我順利過關(guān),但是該掌握的知識不能放手,現(xiàn)在來整理數(shù)據(jù)庫-索引的相關(guān)知識及原理。
什么是索引?
舉個栗子,我們拿出一本新華字典,它的目錄實際上就是一種索引:非聚集索引。我們可以通過目錄迅速定位我們要查的字。而字典的內(nèi)容部分一般都是按照拼音排序的,這實際上又是一種索引:聚集索引。
更加具體的內(nèi)容請移步百度百科:索引-百度百科資料
索引的分類
- 聚集索引
- 非聚集索引
- 哈希索引
- B+-樹索引(二分查找)
索引有什么作用
在數(shù)據(jù)庫系統(tǒng)中建立索引主要有以下作用:
- 快速取數(shù)據(jù);
- 保證數(shù)據(jù)記錄的唯一性;
- 實現(xiàn)表與表之間的參照完整性;
- 在使用 ORDER BY、GROUP BY 子句進行數(shù)據(jù)檢索時,利用索引可以減少排序和分組的時間。
索引有什么優(yōu)缺點
優(yōu)點
- 大大加快數(shù)據(jù)的檢索速度;
- 創(chuàng)建唯一性索引,保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性;
- 加速表和表之間的連接;
- 在使用分組和排序子句進行數(shù)據(jù)檢索時,可以顯著減少查詢中分組和排序的時間。
缺點
- 索引需要占物理空間。
- 當(dāng)對表中的數(shù)據(jù)進行增加、刪除和修改的時候,索引也要動態(tài)的維護,降低了數(shù)據(jù)的維護速度。
什么時候使用索引
如果某個字段,或一組字段會出現(xiàn)在一個會被頻繁調(diào)用的 WHERE 子句中,那么它們應(yīng)該是被索引的,這樣會更快的得到結(jié)果。為了避免意外的發(fā)生,需要恰當(dāng)?shù)厥褂梦ㄒ凰饕?,并且我個人不推薦使用全文索引,尤其對于漢字來說,全文索引的開銷太大了,得不償失。
索引至少會帶來如下的overhead額外的創(chuàng)建時間額外的存儲空間(單列索引占原表5%至15%空間,想象一下如果為一個表創(chuàng)建三四個索引)額外的維護時間這一切只為了一個目的:減少在small range query的情況下的query time。如果是大range query 返回1%以上的數(shù)據(jù),這情況下索引的意義不大。
選擇什么索引
- low selectivity 情況下: 比如 parent column 為性別,bitmap index什么的可以考慮。
- high selectivity 可以用 btree 來維持二分查找的查找效率
寫在最后
到現(xiàn)在,你應(yīng)該對索引有一個具體的認識和運用的體會,凡事有得必有失,而使用的利弊權(quán)衡必須有實際的操作才有發(fā)言的自由,所以,在這篇文章之后,自行到數(shù)據(jù)庫進行一次十萬級數(shù)據(jù)有索引和無索引的練習(xí)吧,祝生活更好!