MySQL explain執行計畫最佳化
explain執行計畫
簡介MySQL調優:
- 先發現問題(慢查詢,profile)
- 對於使用索引和沒有使用索引,瞭解到索引可以快速去尋找資料
- 瞭解什麼是索引(索引是排好序的快速尋找的資料結構)
- 索引的管理(查看,建立,刪除)
- 索引的本身的資料結構(B-TREE結構和聚簇結構)
- MySQL是如何去使用這些索引的(explain工具),需要去發現索引是否合理的被使用,防止索引濫用。
注意:索引對查詢是有協助的,但是對更新是沒有好處的。索引要建立的合理。
MySQL調優的一個通用思路(面試題):通過上面的步驟就可以對MySQL進行調優,只要將上面的步驟重複不斷執行,可以使用MySQL在最優的情況下工作。
profile定義:MySQL提供的一個可以分析SQL語句執行過程的工具,通過它大致可以瞭解到MySQL將如何執行使用者傳遞過來的sql語句。
用法
使用的時候只要在對應的sql語句前面,加上關鍵字explain 或者同義字 desc
# desc select * from tableName where id = 1000000;
# explain select * from tableName where id = 1000000;
以上兩條sql執行效果是等價的。
可以先簡單對比 有索引 和 無索引 執行計畫:
no_index無索引的情況下分析:
rows: 代表查詢滿足該sql語句的結果,可能需要查詢行的數量。
id存在主鍵索引的情況下分析:
type:重點分析
- all 代表全表掃描,一般在不使用索引的情況下回出現該值
全表掃描:一行一行的逐行比較,然後返回滿足條件的記錄。
- const,代表使用了主鍵索引。 開發之中,盡量出現這個。常量尋找
3. range代表範圍操作,當執行的sql語句是一個範圍尋找的時候,也可以使用索引。
range含義解釋:由於索引是排好序的結構。沿著這個有序的結構,再去截取一段有序的資料,是可以利用上索引的。
面試題:什麼樣的欄位適合建立索引?(建立索引的時候有什麼考慮?)
答:
- 在where條件後面作為查詢的欄位需要建立索引。
- 在(排序order 範圍range 分組group)這些情況下也是可以使用索引的,所以在排序欄位後面加上索引也是可以的。
注意:在where條件後也不是所有的欄位都建立索引,因為索引本身也是有開銷的。
- index代表使用了索引
當做記錄統計的時候,可以直接使用索引返回記錄的行數,就沒必要去對磁碟檔案的行數做統計。
- system,當表中的記錄只有一行的時候,MySQL認為可以直接的返回記錄資訊,而不必要使用索引檔案。一般出現在一行記錄(自己建立的表)或者系統層級的表(mysql.user)一般MySQL在啟動的時候,會將部分的系統層級的表優先載入到記憶體做一個緩衝。
- null,可能出現,如果出現這個,也代表很好。基本不容易出現。
總結:null 》system》const》range》index》all
注意:盡量不要出現all
本文永久更新連結地址: