索引是什么
- 索引是幫助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是聚集的索引實現
- 索引和數據在同一個文件中
- 數據的存儲是建立在主鍵索引結構中,葉子節點是具體的數據。故必須要有主鍵
- 其他索引的葉子節點是主鍵的值
- 【好處】一致性和節省存儲空間