MySQL

1.什么是索引

索引(Index)是幫助MySQL高效獲取數據的數據結構。

索引的本質:索引是數據結構

阿里巴巴《Java 開發手冊》提出單表行數超過 500 萬行或者單表容量超過 2GB,才推薦進行分庫分表。
如果預計三年后的數據量根本達不到這個級別,請不要在創建表時就分庫分表。

2.外存儲器-磁盤

計算機一般有兩種存儲的方式:「內存儲器」(main memory)和「外存儲器」(external memory)

  • 內存:讀寫速度非常快,但是容量很小,而且造價非常貴,在不通電的情況下會數據會丟失,不能長期存儲數據;
  • 外存:磁盤是相對常見的外存儲設備,它是以存取時間變化不大為特征的。可以直接存取任何字符組,且容量大、速度較其它外存設備更快。

2.1 磁盤的構造

磁盤是一個扁平的圓盤(與電唱機的唱片類似)。盤面上有許多稱為磁道的圓圈,數據就記錄在這些磁道上。磁盤可以是單片的,也可以是由若干盤片組成的盤組,每一盤片上有兩個面。

當磁盤驅動器執行讀/寫功能時。盤片裝在一個主軸上,并繞主軸高速旋轉,當磁道在讀/寫頭(又叫「磁頭」) 下通過時,就可以進行數據的讀/寫了。

3.索引的本質

索引」是幫助MySQL高效獲取數據的「排好序」的「數據結構」

索引數據結構

3.1索引數據結構,主要包含以下幾類

  • 二叉樹
  • 平衡二叉樹
  • 紅黑樹
  • Hash表
  • B-Tree

3.2 二叉樹

「定義」:每個結點最多有兩個子樹,左子樹比父節點小,右子樹比父節點大。

二叉樹

3.3 平衡二叉樹(AVL Tree)

「定義」:平衡二叉樹又稱AVL樹,是一種特殊的二叉查找樹,其左右子樹都是平衡二叉樹,且左右子樹高度差的絕對值不超過1。

「缺點」:AVL樹是高度平衡的,頻繁的插入和刪除,會引起頻繁的rebalance,導致效率下降


平衡二叉樹

3.4 紅黑樹

「定義」:

  • 性質1. 節點是紅色或黑色。
  • 性質2. 根節點是黑色。
  • 性質3 每個紅色節點的兩個子節點都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點)
  • 性質4. 從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。

「缺點」:數據量大會導致樹層數比較多,這樣就會造成查找數據慢。


紅黑樹

3.5 Hash數據結構

「定義」:散列表(Hash table,也叫哈希表),是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說,它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫做散列函數,存放記錄的數組叫做散列表。 對目標值進行hash運算得到hash值和數據磁盤指針地址保存到hash表,這樣就達到快速定位數據位置。

「缺點」:精確查找十分快速,但范圍查找就碰壁了。

3.6 BTree

「定義」:

  • 一個節點可以存儲多個數據,這樣可以避免黑紅樹的缺點,樹的層數變??;
  • 葉節點具有相同的深度,葉節點的指針為空;
  • 所有索引元素不重復;
  • 節點中的數據索引從左到右遞增排列。

「缺點」:節點里面數組數據:每個數據的結構=索引數據+數據記錄(即葉子節點存儲鍵值和數據記錄)。

BTree

「模擬查找關鍵字29的過程:」

1.根據根節點找到磁盤塊1,讀入內存?!敬疟PI/O操作第1次】
2.比較關鍵字29在區間(17,35),找到磁盤塊1的指針P2。
3.根據P2指針找到磁盤塊3,讀入內存?!敬疟PI/O操作第2次】
4.比較關鍵字29在區間(26,30),找到磁盤塊3的指針P2。
5.根據P2指針找到磁盤塊8,讀入內存?!敬疟PI/O操作第3次】
6.在磁盤塊8中的關鍵字列表中找到關鍵字29。

分析上面過程,發現需要3次磁盤I/O操作,和3次內存查找操作。由于內存中的關鍵字是一個有序表結構,可以利用二分法查找提高效率。而3次磁盤I/O操作是影響整個B-Tree查找效率的決定因素。B-Tree相對于AVLTree縮減了節點個數,使每次磁盤I/O取到內存的數據都發揮了作用,從而提高了查詢效率。

3.7 B+Tree

「定義」:B+Tree是在B-Tree基礎上的一種優化。節點里面數組數據:每個數據只存儲鍵信息,這樣不存數據可以騰出空間放更多的鍵信息,讓樹層數越小

  • 非葉子節點不存儲data,只存儲索引(冗余),可以放更多的索引
  • 葉子節點包含所有索引字段
  • 葉子節點用指針連接,提高區間訪問的性能
  • 將上一節中的B-Tree優化,由于B+Tree的非葉子節點只存儲鍵值信息,假設每個磁盤塊能存儲4個鍵值及指針信息,則變成B+Tree后其結構如下圖所示:
B+Tree

4.存儲引擎

數據庫存儲引擎是數據庫底層軟件組件,數據庫管理系統使用數據引擎進行創建、查詢、更新和刪除數據操作。不同的存儲引擎提供不同的存儲機制、索引技巧、鎖定水平等功能,使用不同的存儲引擎還可以獲得特定的功能。

MySQL 的核心就是存儲引擎

  • InnoDB 事務型數據庫的首選引擎,支持事務安全表(ACID),支持行鎖定和外鍵。MySQL 5.5.5 之后,InnoDB 作為默認存儲引擎。
  • MyISAM 是基于 ISAM 的存儲引擎,并對其進行擴展,是在 Web、數據倉儲和其他應用環境下最常使用的存儲引擎之一。MyISAM 擁有較高的插入、查詢速度,但不支持事務。
  • MEMORY 存儲引擎將表中的數據存儲到內存中,為查詢和引用其他數據提供快速訪問。

4.1 如何選擇 MySQL 存儲引擎

可以根據以下的原則來選擇 MySQL 存儲引擎:

  • 如果要提供提交、回滾和恢復的事務安全(ACID 兼容)能力,并要求實現并發控制,InnoDB 是一個很好的選擇。
  • 如果數據表主要用來插入和查詢記錄,則 MyISAM 引擎提供較高的處理效率。
  • 如果只是臨時存放數據,數據量不大,并且不需要較高的數據安全性,可以選擇將數據保存在內存的 MEMORY 引擎中,MySQL 中使用該引擎作為臨時表,存放查詢的中間結果。
  • 如果只有 INSERT 和 SELECT 操作,可以選擇Archive 引擎,Archive 存儲引擎支持高并發的插入操作,但是本身并不是事務安全的。Archive 存儲引擎非常適合存儲歸檔數據,如記錄日志信息可以使用 Archive 引擎。

4.2 MyISAM存儲引擎

數據存儲形式
MyISAM采用的是索引與數據分離的形式,將數據保存在三個文件中.frm 、.MYD、.MYI。

.frm : 存儲表結構
.MYD :存儲表數據
.MYI :存儲表索引

鎖的粒度

MyISAM不支持行鎖,所以讀取時對表加上共享鎖,在寫入時對表加上排他鎖。由于是對整張表加鎖,相比InnoDB,在并發寫入時效率很低。

事務

MyISAM不支持事務。

數據的存儲特點

MyISAM是基于「非聚簇索引」進行存儲的。

索引實現

MyISAM索引文件和數據文件是分離的(「非聚集」)


其他
-MyISAM提供了大量的特性,包括全文索引,壓縮,空間函數,延遲更新索引鍵等。

  • 進行壓縮后的表是不能進行修改的,但是壓縮表可以極大減少磁盤占用空間,因此也可以減少磁盤IO,從而提供查詢性能。

  • 全文索引,是一種基于分詞創建的索引,可以支持復雜的查詢。

  • 延遲更新索引鍵,不會將更新的索引數據立即寫入到磁盤,而是會寫到內存中的緩沖區中,只有在清除緩沖區時候才會將對應的索引寫入磁盤,這種方式大大提升了寫入性能。

https://mp.weixin.qq.com/s?__biz=MzA4NjI1MTkyNw==&mid=2449993426&idx=1&sn=ee5259d80cd38189a7d5001a063b1044&chksm=8838ce2abf4f473cc2f00957e7ced6cf57104d418e622a694b48e53ef74ed6b6ba4fbb61f950&scene=178#rd

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容