「MySQL高級篇」MySQL索引原理,設計原則

大家好 , 我是melo,一名大二后臺練習生,大年初三 , 我又來充當反內卷第一人了?。。?
專欄引言MySQL,一個熟悉又陌生的名詞,早在學習Javaweb的時候,我們就用到了MySQL數據庫,在那個階段,MySQL對我們來說似乎只是一個存儲數據的好東西 , 存儲時一股腦往里邊塞,查詢時也是盲目的全表查詢(不帶一點點優化) 。?
我們總是自欺欺人的覺得,我們通過其他方面來優化就好了阿,遲遲不愿面對MySQL高級 , 轉而學習一些看似更為"高級"的東西,學Redis , 來分擔MySQL的壓力,學MyCat等中間件 , 實現主從復制 , 讀寫分離,分庫分表等等 。(說的就是melo沒錯了)?
到了準備面試的時候,發現面試題里邊的MySQL一問三不知~
「MySQL高級篇」MySQL索引原理,設計原則

文章插圖
而自己學到的前沿中間件,問的幾乎很少?。∽約閡倉皇腔嵊?,寫簡歷時只能弱弱寫上"了解"xxx中間件……?
當然了,學習MySQL高級篇,不單單只是為了面試,實際的項目中,這一塊的優化是十分重要的,體驗過服務器宕機后,只能默默........
「MySQL高級篇」MySQL索引原理,設計原則

文章插圖
?
從現在開始吧,此時上岸還來得及?。。〕米糯蠖系暮伲?補充補充MySQL高級篇的知識點,從如下幾方面開啟 MySQL高級篇之旅
「MySQL高級篇」MySQL索引原理,設計原則

文章插圖
本篇速覽早在MySQL基礎篇,我們就聽說了索引這么個東西,聽起來是個很高級的東西,但當時只停留在了,索引能夠加快查找的效率這一階段的認知 。這篇將從如下幾點,來帶你逐一攻破ta:
  • 索引到底是什么
  • 索引底層的實現
  • 聚簇索引是什么?二級索引呢?
  • 最左前綴原則
  • 如何設計索引,遵循的原則
  • 索引相關語法
?
本篇篇幅較長,全文近6000字,可以收藏下來慢慢啃,沒事就掏出來翻閱翻閱 。建議通過側邊欄目錄檢索對您有幫助的部分,其中有emoji表情前綴屬于重點部分,覺得對您有幫助的話,melo還會持續更進完善本篇文章和MySQL專欄 。
  • 不過就怕等到我更新時,那會您不方便找到我了hhh(高情商求關注)
索引定義MySQL官方對索引的定義為:索引(index)是幫助MySQL高效獲取數據的數據結構(有序) 。索引是在數據庫表的字段上添加的,是為了提高查詢效率存在的一種機制 。在數據之外,數據庫系統還維護著滿足特定查找算法的數據結構,這些數據結構以某種方式引用(指向)數據,這樣就可以在這些數據結構上實現高級查找算法 , 這種數據結構就是索引 。如下面的示意圖所示 :
其實簡單來說,索引就是一個排好序的數據結構

「MySQL高級篇」MySQL索引原理,設計原則

文章插圖
?
左邊是數據表,一共有兩列七條記錄,最左邊的是數據記錄的物理地址(注意邏輯上相鄰的記錄在磁盤上也并不是一定物理相鄰的) 。為了加快Col2的查找,可以維護一個右邊所示的二叉查找樹,每個節點分別包含索引鍵值和一個指向對應數據記錄物理地址的指針,這樣就可以運用二叉查找快速獲取到相應數據 。
索引優勢
  • 加快查找和排序的速率,降低數據庫的IO成本以及CPU的消耗
  • 通過創建唯一性索引,可以保證數據庫表中每一行數據的唯一性 。
索引劣勢
  1. 索引實際上也是一張表,保存了主鍵和索引字段 , 并指向實體類的記錄,本身需要占用空間
  2. 雖然增加了查詢效率,但對于增刪改,每次改動表,還需要更新一下索引
    1. 新增:自然需要在索引樹中新增節點
    2. 刪除:索引樹中指向的記錄可能會失效,意味著這棵索引樹很多節點,都是失效的
    3. 改動:索引樹中節點的指向可能需要改變
但實際上呢,我們MySQL中并不是用二叉查找樹來存儲 , 為何呢?
要知道 , 二叉查找樹,此處一個節點只能存儲一條數據,而一個節點呢,在MySQL里邊又對應一個磁盤塊,這樣我們每次讀取一個磁盤塊,只能獲取一條數據,效率特別的低,所以我們會想到采用B樹這種結構來存儲 。
索引結構索引是在MySQL的存儲引擎層中實現的,而不是在服務器層實現的 。所以每種存儲引擎的索引都不一定完全相同 , 而且也不是所有的引擎都支持所有的索引類型 。?

推薦閱讀