數(shù)據(jù)庫-索引的原理(面試高危之必備技能)

前言

非常有幸通過了支付寶的一輪電面,面試官對我評價較高,題目中設(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)中建立索引主要有以下作用:

  1. 快速取數(shù)據(jù);
  2. 保證數(shù)據(jù)記錄的唯一性;
  3. 實現(xiàn)表與表之間的參照完整性;
  4. 在使用 ORDER BY、GROUP BY 子句進行數(shù)據(jù)檢索時,利用索引可以減少排序和分組的時間。

索引有什么優(yōu)缺點

優(yōu)點

  1. 大大加快數(shù)據(jù)的檢索速度;
  2. 創(chuàng)建唯一性索引,保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性;
  3. 加速表和表之間的連接;
  4. 在使用分組和排序子句進行數(shù)據(jù)檢索時,可以顯著減少查詢中分組和排序的時間。

缺點

  1. 索引需要占物理空間。
  2. 當(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í)吧,祝生活更好!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容