MySql 的效能分析和索引建立與優化
阿新 • • 發佈:2018-12-14
1、索引簡單語法
-
建立 CREATE [UNIQUE ] INDEX indexName ON mytable(columnname(length)); ALTER mytable ADD [UNIQUE ] INDEX [indexName] ON (columnname(length));
-
刪除 DROP INDEX [indexName] ON mytable;
-
展示 SHOW INDEX FROM table_name\G
2、MySql 的效能分析
- 檢視執行計劃 Explain + SQL語句
- 怎麼看/每個欄位的意思
主要欄位分析
-
id
select查詢的序列號,包含一組數字,表示查詢中執行select子句或操作表的順序 相同:從上而下 不同:從大到小 相同不同:先大小後從上到小
-
type
顯示查詢使用了何種型別,從最好到最差依次是: system>const>eq_ref>ref>range>index>ALL
-
key
實際使用的欄位,查詢中若使用了覆蓋索引,則該索引和查詢的select欄位重疊
-
Extra
包含不適合在其他列中顯示但十分重要的額外資訊 Using filesort 查詢排序中的欄位 ,不推薦 Using temporary 使用臨時表是 ,索引必定失效 USING index 效率最好的 Using where 使用where 語句進行查詢
-
select_type
查詢的型別,主要是用於區別 普通查詢、聯合查詢、子查詢等的複雜查詢 simple primary subquery(子查詢)、 derived(子查詢的衍生)、UOION、UNION RESULT
-
ref
顯示索引的哪一列被使用了,如果可能的話,是一個常數。哪些列或常量被用於查詢索引列上的值
3、索引優化
- Join語句的優化 儘可能減少Join語句中的NestedLoop的迴圈總次數;“永遠用小結果集驅動大的結果集”。 優先優化NestedLoop的內層迴圈; 保證Join語句中被驅動表上Join條件欄位已經被索引; 當無法保證被驅動表的Join條件欄位被索引且記憶體資源充足的前提下,不要太吝惜JoinBuffer的設定;
- 建立索引的原則和索引失效的 1、全職匹配我最愛 2、最佳左字首法則 3、不在索引列上做任何的操作(計算、函式、自動或手動型別轉換 ),會造成索引失效導致全表掃描 4、索引、儲存引擎不能使用索引中範圍條件右邊的列 5、儘量使用索引覆蓋(只訪問索引查詢列),避免select * 6、MySql在使用不等於時,會導致 7、is null 、is not null 也無法使用索引 8、like 以萬用字元(‘%acv’)會引起索引失效,% 要在最右邊 9、字串不用’'引號處理會索引失效 10、少用or,用它來連線時會引起索引失效
- 一般性的建議 對於單鍵索引儘量選擇針對當前query過濾性 在選擇組合索引的時候。當前Query中過濾性最好的欄位在索引欄位順序中儘量靠前使用 在選擇組合索引的時候,儘量選擇可以能夠包含當前query中的where字句中更多欄位的索引 儘可能通過分析統計資訊和調整query的寫法來達到選擇合適索引的目的