MySql的索引機制

mysql引擎

  • 物理存儲格式 compact: SHOW TABLE STATUS

存疑

  • 每一次插入數據時,是不是都要重新對所有的索引樹設置?
  • 葉子節點的數據時保存在哪裏的,內存中?如果沒有找到數據,要如何去磁盤中獲取數據?獲取之後,是不是有時間有效期,有效期過了,就將該部分內存釋放?
  • 如果全表查詢,數據都加載到內存中?

查詢的時候,先把磁盤的數據加載到bufferPool緩存,然後更新的時候,更新bufferPoll,同時維護一堆鏈表,然後定時或者不定時的根據flush和lru鏈表,將bufferPool裏的更新過的髒數據刷新到磁盤上

  • 數據插入的時候,是如何存放磁盤的?將相鄰的key值存放在一起,之前的數據進行移動?

爲什麼要用B+樹進行mysql索引設計呢?

  • 1.B+tree能很好的利用操作系統和磁盤的交互特性,mysql將頁設置爲16k,一次io就可以將一個節點(16K)的內容加載到內存中,比如,假設關鍵字爲int類型,則可以大約存儲(16*1000)/8=2000個關鍵字,3層高度可以搜索的關鍵字個數遠遠大於二叉樹
  • 2.B+樹保證樹的平衡的過程中,每次關鍵字的變化,都會導致結構發生很大的變化,所以要創建合適的索引
  • 3.只有葉子節點才保存數據,其他的節點不保存數據
  • 4.查詢速度更穩定,天然具備排序功能,全節點遍歷更快

MyIsam

  • 非聚集索引
  • 使用的是B+樹創建索引,葉子節點保存的是磁盤的地址
  • 可以沒有主鍵
  • 每一個索引都是一顆樹
  • 相比Innodb來說,性能好於非主鍵索引

Innodb

  • 聚集索引
  • 使用的是B+樹索引,葉子節點保存的是實際的數據
  • 主鍵索引創建樹,非主鍵索引構建一棵葉子節點爲主鍵的樹,通過找到主鍵,然後再主鍵索引樹中查找
  • 注意事項:

1.索引越離散越好
2.不要創建冗餘的索引,儘量的擴展索引,而不是創建索引 3.最小的主鍵空間,空間越小,則每個節點保存的關鍵字數據就越多 4.儘量的採用指定列,而不是select * 5.最左匹配原則

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章