2019-05-17 深入淺出數(shù)據(jù)庫索引原理

https://zhuanlan.zhihu.com/p/23624390

深入淺出數(shù)據(jù)庫索引原理

前段時間,公司一個新上線的網(wǎng)站出現(xiàn)頁面響應速度緩慢的問題, 一位負責這個項目的但并不是搞技術的妹子找到我,讓我想辦法提升網(wǎng)站的訪問速度 ,因為已經(jīng)有很多用戶來投訴了。我第一反應覺的是數(shù)據(jù)庫上的問題,假裝思索了一下,擺著一副深沉炫酷的模樣說:“是不是數(shù)據(jù)庫查詢上出問題了, 給表加上索引吧”,然后妹子來了一句:“現(xiàn)在我們網(wǎng)站訪問量太大,加索引有可能導致寫入數(shù)據(jù)時性能下降,影響用戶使用的”。當時我就楞了一下, 有種強行裝逼被拆穿的感覺,在自己的專業(yè)領域居然被非專業(yè)的同學教育, 面子上真有點掛不住。

其實, 我說這個例子并不是為展現(xiàn)我們公司的同事們專業(yè)能力的強大、做的產品棒、安全性高、性能牛逼, 連非技術的同事也懂得技術上的細節(jié)。事實上我只是想說明,「數(shù)據(jù)庫」和「數(shù)據(jù)庫索引」這兩個東西是在服務器端開發(fā)領域應用最為廣泛的兩個概念,熟練使用數(shù)據(jù)庫和數(shù)據(jù)庫索引是開發(fā)人員在行業(yè)內生存的必備技能,而整天和技術人員打交道的非技術人員們,由于耳濡目染久了,自然也就能講個頭頭是道了。

使用索引很簡單,只要能寫創(chuàng)建表的語句,就肯定能寫創(chuàng)建索引的語句,要知道這個世界上是不存在不會創(chuàng)建表的服務器端程序員的。然而, 會使用索引是一回事, 而深入理解索引原理又能恰到好處使用索引又是另一回事,這完全是兩個天差地別的境界(我自己也還沒有達到這層境界)。很大一部份程序員對索引的了解僅限于到“加索引能使查詢變快”這個概念為止。

  • 為什么要給表加上主鍵?

  • 為什么加索引后會使查詢變快?

  • 為什么加索引后會使寫入、修改、刪除變慢?

  • 什么情況下要同時在兩個字段上建索引?

這些問題他們可能不一定能說出答案。知道這些問題的答案有什么好處呢?如果開發(fā)的應用使用的數(shù)據(jù)庫表中只有1萬條數(shù)據(jù),那么了解與不了解真的沒有差別, 然而, 如果開發(fā)的應用有幾百上千萬甚至億級別的數(shù)據(jù),那么不深入了解索引的原理, 寫出來程序就根本跑不動,就好比如果給貨車裝個轎車的引擎,這貨車還能拉的動貨嗎?

接下來就講解一下上面提出的幾個問題,希望對閱讀者有幫助。

網(wǎng)上很多講解索引的文章對索引的描述是這樣的「索引就像書的目錄, 通過書的目錄就準確的定位到了書籍具體的內容」,這句話描述的非常正確, 但就像脫了褲子放屁,說了跟沒說一樣,通過目錄查找書的內容自然是要比一頁一頁的翻書找來的快,同樣使用的索引的人難到會不知道,通過索引定位到數(shù)據(jù)比直接一條一條的查詢來的快,不然他們?yōu)槭裁匆ㄋ饕?/p>

想要理解索引原理必須清楚一種數(shù)據(jù)結構「平衡樹」(非二叉),也就是b tree或者 b+ tree,重要的事情說三遍:“平衡樹,平衡樹,平衡樹”。當然, 有的數(shù)據(jù)庫也使用哈希桶作用索引的數(shù)據(jù)結構 , 然而, 主流的RDBMS都是把平衡樹當做數(shù)據(jù)表默認的索引數(shù)據(jù)結構的。

我們平時建表的時候都會為表加上主鍵, 在某些關系數(shù)據(jù)庫中, 如果建表時不指定主鍵,數(shù)據(jù)庫會拒絕建表的語句執(zhí)行。 事實上, 一個加了主鍵的表,并不能被稱之為「表」。一個沒加主鍵的表,它的數(shù)據(jù)無序的放置在磁盤存儲器上,一行一行的排列的很整齊, 跟我認知中的「表」很接近。如果給表上了主鍵,那么表在磁盤上的存儲結構就由整齊排列的結構轉變成了樹狀結構,也就是上面說的「平衡樹」結構,換句話說,就是整個表就變成了一個索引。沒錯, 再說一遍, 整個表變成了一個索引,也就是所謂的「聚集索引」。 這就是為什么一個表只能有一個主鍵, 一個表只能有一個「聚集索引」,因為主鍵的作用就是把「表」的數(shù)據(jù)格式轉換成「索引(平衡樹)」的格式放置。

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

相關閱讀更多精彩內容

  • 前段時間,公司一個新上線的網(wǎng)站出現(xiàn)頁面響應速度緩慢的問題, 一位負責這個項目的但并不是搞技術的妹子找到我,讓我想辦...
    ifels閱讀 714評論 0 4
  • 使用索引很簡單,只要能寫創(chuàng)建表的語句,就肯定能寫創(chuàng)建索引的語句,要知道這個世界上是不存在不會創(chuàng)建表的服務器端程序員...
    大浪淘沙丶閱讀 1,088評論 0 1
  • 前言 索引,一種強大的存在;不管是什么行業(yè),數(shù)據(jù)都是根基,終將落盤固化,提供各方檢索查詢,之前整理了一篇[《深入淺...
    碼農戲碼閱讀 1,662評論 1 43
  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當在唯一索引所對應的列上鍵入重復值時,會觸發(fā)此異常。 O...
    我想起個好名字閱讀 5,985評論 0 9
  • 感謝今天的晨讀內容,讓我意識到自己在和妻子溝通的不足。妻子經(jīng)常會和我說:我說話時,你能不能給個回應???你不回應我會...
    一座l孤島閱讀 170評論 0 1

友情鏈接更多精彩內容