說說MySQL索引機制

索引原理

  • 索引簡述

首先MySQL如果沒有索引的話查詢速度非常的慢,於是鑑於二分查找的快速性建立索引,MySQL用的是B+樹做索引,如圖
在這裏插入圖片描述
子葉節點保存數據信息,非子葉節點保存目錄信息,即對應某頁的最小值和指向某頁每個節點保存一頁數據,頁之間用雙向鏈表連接(用雙向鏈表便於遍歷),一頁保存16k的記錄,頁面內每條記錄之間通過單鏈表連接(用單鏈表主要是爲了重複利用空間設計),由主鍵(如果沒有設計主鍵按隱藏自增主鍵列的值)小到大排序好的,每個頁還有相應的槽像書的目錄一樣記錄一段記錄的值和地址偏移可以直接指向訪問而不是從鏈頭遍歷訪問那種。B+樹索引的查詢過程爲先與B+樹的根進行對比查找,通過索引值對比槽進行快速尋找,找到一個後一個值比它大前一個值比它小的位置,去小的那列獲取對應頁數找到對應的頁數做同樣的比較尋找,當找到葉子節點時即找到。

  • 二級索引
    二級索引即通過索引列再建立一顆B+樹,樹的節點保存的和一級索引不同的是在非子葉節點多保存主鍵值保證索引的唯一性,在葉子節點保存的只有該二級索引值和對應以及索引即主鍵值,不保存完整的數據列。查詢過程先通過索引找到該值對應的主鍵值再通過主鍵值進行回表查詢到完整的記錄,但如果只是查詢主鍵值就不用回表,所以儘量少用或者不用類似(select * from xxxx)這種星號的查詢。

SQL執行慢的原因

  1. 偶爾慢
    可能是日誌redo寫滿了在刷新髒頁然後讀取到緩衝區過程變慢,或者可能要訪問的數據有鎖處於阻塞等待。
  2. 一直很慢
    這種情況就是往沒走索引的方向找原因,可能是沒有建立索引,可能是建立了沒有走索引,可能是數據庫選錯了索引。
    常見的就是比如索引列用了 表達式,模糊查詢時模糊符號在前面等就會不走索引
    數據庫走錯索引多半是因爲查找二級索引時數據庫會在查詢優化器裏預判是直接全盤掃描還是先走二級索引再回表代價大,誰代價更小用誰通過採樣統計的方式預判,所以可能會預判錯誤,然後不走索引而是全盤掃描。

總結

在使用索引時需要注意下邊這些事項:
1、只爲用於搜索、排序或分組的列創建索引
2、爲列的基數大的列創建索引
3、索引列的類型儘量小
4、可以只對字符串值的前綴建立索引
5、只有索引列在比較表達式中單獨出現纔可以適用索引
6、爲了儘可能少的讓聚簇索引發生頁面分裂和記錄移位的情況,建議讓主鍵擁有AUTO_INCREMENT屬性。
7、定位並刪除表中的重複和冗餘索引
8、儘量使用覆蓋索引進行查詢,即最好在查詢列表裏只包含索引列避免回錶帶來的性能損耗。

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