【一步一步學習mysql】Mysql索引底層數據結構與算法


索引是什么

  • 索引是幫助MySQL高效獲取數據的排好序的數據結構。
  • 索引存儲在文件里
  • 補充知識:
磁盤存取原理:
* 尋道時間(速度慢,費時)
* 旋轉時間(速度較快)

磁盤IO讀取效率:
* 單次IO讀取是N個頁的大小,讀取數據量大於N個頁就需要分頁讀取。
  • 索引的數據結構,推薦學習網站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
    • 二叉樹
      • 有可能出現worst-case,如果輸入序列已經排序,則時間復雜度為O(N)
    • 紅黑樹
      • 解決了二叉樹的缺點,但是在數據量大的情況下,會出現分層很深的情況,影響查詢效率。
    • hash
      • 查詢效率很高,但是無法實現范圍查詢
    • B樹
      • 【特點】度(Degree)-節點的數據存儲個數
      • 【特點】葉節點具有相同的深度
      • 【特點】葉節點的指針為空
      • 【特點】節點中的數據key從左到右遞增排列
      • 【缺點】每個節點存儲key+具體數據,而度涉及到IO讀取,故如果度設計的很大就會影響IO讀取效率。由於該限制,只能限制度的大小,使得深度無法控制。
    • B+樹
      • 非葉子節點不存儲data,只存儲key,可以增大度
      • 葉子節點不存儲指針
      • 順序訪問指針,提高區間訪問的性能
      • 優點
        • 一般使用磁盤I/O次數評價索引結構的優劣
        • 預讀:磁盤一般會順序向后讀取一定長度的數據(頁的整數倍)放入內存
        • 局部性原理:當一個數據被用到時,其附近的數據也通常會馬上被使用
        • B+Tree節點的大小設為等於一個頁,每次新建節點直接申請一個頁的空間,這樣就保證一個節點物理上也存儲在一個頁里,就實現了一個節點的載入只需一次I/O
        • B+Tree的度d一般會超過100,因此h非常小(一般為3到5之間)
        • 【最佳實踐】使用自增的主鍵
          • a.自增型主鍵以利於插入性能的提高;
          • b.自增型主鍵設計(int,bigint)可以降低二級索引的空間,提升二級索引的內存命中率;
          • c.自增型的主鍵可以減小page的碎片,提升空間和內存的使用。

存儲引擎

  • 存儲引擎是表的屬性。
  • MyISAM是非聚集的索引實現
    • 索引文件和數據文件是分開的兩個文件
    • 索引中葉子節點存儲的是數據的地址
      • 主鍵索引和其他索引都是一樣的,葉子節點指向的是數據文件中對應的地址
  • InnoDB是聚集的索引實現
    • 索引和數據在同一個文件中
    • 數據的存儲是建立在主鍵索引結構中,葉子節點是具體的數據。故必須要有主鍵
    • 其他索引的葉子節點是主鍵的值
    • 【好處】一致性和節省存儲空間


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM