More  

小編的世界 優質文選 資料

阿裏p7經驗分享!這些Mysql索引底層知識進大廠是你必須要吃透的


2021年5月20日 - 資料小編 IT界的奮鬥者 
   

IT界的奮鬥者

今天我們從最基礎的方面來聊聊MySQL索引,我相信應該有不少小夥伴都掌握了基本的數據庫操作,增(insert)刪(delete)查(select)改(update)。如果學得更深入的話,對於數據庫的複雜查詢SQL語句也有所了解,索引的概念因此略知一二,因為我們平時做的項目相對較小,比如就簡單的一個Web系統。

數據庫中的數據也不多,所以會感覺索引是否使用的效果差別不大,最多就是在一個表中定義了主鍵(Primary Key)。但是對於大型在線系統來說,數據庫中的數據量億萬級別以上,索引對數據庫查詢的效率就很重要了,這明顯是關乎用戶體驗的事情。所以,來認識一下MySQL索引,為之後遇到優化SQL查詢打基礎!

MySQL索引是什麼?

它是存儲引擎用來快速找到目標記錄的一種數據結構。

它的工作原理就像,我們去看一本書,會先看目錄(索引)部分,然後看到感興趣的章節就根據頁碼翻看。在MySQL中,存儲引擎(MylSAM、InnoDB等)使用索引,就會先在索引中找到對應值,然後根據匹配到的索引回表去找數據行。

MySQL有哪些索引,使用索引有什麼優勢呢?

索引類型:
MySQL中的索引類型有很多,比如B+樹索引、哈希索引、聚簇索引、覆蓋索引,這幾個比較常見而且使用較多的,還有空間數據索引、全文索引等。

索引的優點:
索引可以讓存儲引擎快速定位到表中的指定位置,當然還有其他索引的功能。簡單概況有這幾個優點:1.大幅度減少服務器需要掃描的數據量。2.可以幫助服務器避免排序和臨時表。3.將隨機IO編成順序IO。

B+ Tree 索引

B+ Tree數據結構:
最常見的B+樹索引,按照順序存儲數據,在MySQL中可以用作order by和group by的操作實現
。B+ Tree的數據結構大家應該有所了解,B+ Tree中,非葉子結點結構:

所有葉子節點(存放數據)之間是一種鏈式結構。

高性能MySQL書中給出,B+樹存儲數據的結構如圖:

B+ Tree索引特點:
B+樹適用於全鍵值、鍵值範圍和鍵前綴查找(最左前綴)。

特點:葉子到根結點距離相等,索引樹是有序的。

限制:

實驗案例

舉個例子,現在有一張表,各個字段如下:

增加幾條記錄:

索引包括了id、username、password
三個列,存儲在B+樹結構中,會先按照三個字段依次進行排序,我們嘗試查詢,並查看執行計劃。

根據前面查詢是否走索引的特點,可以看到如果從左到右是會使用索引的。接下來測試無法使用索引的情況

哈希索引

哈希索引數據結構:哈希索引:基於哈希表的數據結構實現的,需要精確匹配索引所有列的查詢才有效,存儲引擎會對每一行數據的每一列計算一個哈希碼。

解決哈希沖突:如果多個列的哈希值相同,索引會以鏈表的方式存放多個記錄指針到同一個哈希條目。索引只需存儲對應的哈希值,其結構十分緊湊,查找速度快。

實驗測試:
創建測試哈希索引的表,在name字段加上哈希索引。

也可以自定義哈希索引,下面我們使用CRC32作為哈希函數
,創建偽哈希索引,進行一個簡單的試驗測試:創建觸發器
,當有數據插入或者更新時,自動計算哈希碼存放到crc
字段:

首先需要將分隔符定義為其他符號,這樣才能在創建觸發器時使用分號。

插入記錄:

可以發現觸發器維護了每一行的哈希值。

更新記錄:

id為2的記錄哈希碼也會重新計算。

哈希索引的特點

五、聚簇索引

聚簇索引:實際是一種數據存儲方式。聚簇:表示數據行和相鄰的鍵值緊湊地存儲在一起。InnoDB的聚簇索引是在同一結構中保存了B-Tree索引和數據行。一個表只能有一個聚簇索引。

聚簇索引優點

缺點

覆蓋索引

覆蓋索引:如果一個索引包含(覆蓋)所有需要查詢的字段的值
,這個索引稱為覆蓋索引。Mysql只能使用B-Tree做覆蓋索引。索引可以用來提高查詢效率,那如果能夠直接通過索引獲取數據,就不用回表查詢,更加高效。因此覆蓋索引就提供了這樣的性能。

覆蓋索引的好處:

發現索引的知識點真的很多,而且理解難度不斷增加,如果你能夠堅持讀到這裏,說明你很認真,我相信至少掌握了2/3的內容。

喜歡就一鍵三連吧,更多資料可以私信回複獲取!

  大家在看