MySQL面试题 | 附答案解析(十五)
SQL優化
1. 如何定位及優化SQL語句的性能問題?創建的索引有沒有被使用到?或者說怎么才可以知道這條語句運行很慢的原因?
對于低性能的SQL語句的定位,最重要也是最有效的方法就是使用執行計劃,MySQL提供了explain命令來查看語句的執行計劃。我們知道,不管是哪種數據庫,或者是哪種數據庫引擎,在對一條SQL語句進行執行的過程中都會做很多相關的優化,對于查詢語句,最重要的優化方式就是使用索引。而執行計劃,就是顯示數據庫引擎對于SQL語句的執行的詳細情況,其中包含了是否使用索引,使用什么索引,使用的索引的相關信息等。
執行計劃包含的信息 id 有一組數字組成。表示一個查詢中各個子查詢的執行順序;
(1)id相同執行順序由上至下。
(2)id不同,id值越大優先級越高,越先被執行。
(3)id為null時表示一個結果集,不需要使用它查詢,常出現在包含union等查詢語句中。
select_type 每個子查詢的查詢類型,一些常見的查詢類型。
table 查詢的數據表,當從衍生表中查數據時會顯示 x 表示對應的執行計劃id partitions 表分區、表創建的時候可以指定通過那個列進行表分區。舉個例子:
type(非常重要,可以看到有沒有走索引) 訪問類型
(1)ALL 掃描全表數據
(2)index 遍歷索引
(3)range 索引范圍查找
(4)index_subquery 在子查詢中使用 ref
(5)unique_subquery 在子查詢中使用 eq_ref
(6)ref_or_null 對Null進行索引的優化的 ref
(7)fulltext 使用全文索引
(8)ref 使用非唯一索引查找數據
(9)eq_ref 在join查詢中使用PRIMARY KEYorUNIQUE NOT NULL索引關聯。
possible_keys 可能使用的索引,注意不一定會使用。查詢涉及到的字段上若存在索引,則該索引將被列出來。當該列為 NULL時就要考慮當前的SQL是否需要優化了。
key 顯示MySQL在查詢中實際使用的索引,若沒有使用索引,顯示為NULL。
TIPS:查詢中若使用了覆蓋索引(覆蓋索引:索引的數據覆蓋了需要查詢的所有數據),則該索引僅出現在key列表中
key_length 索引長度
ref 表示上述表的連接匹配條件,即哪些列或常量被用于查找索引列上的值
rows 返回估算的結果集數目,并不是一個準確的值。
extra 的信息非常豐富,常見的有:
(1)Using index 使用覆蓋索引
(2)Using where 使用了用where子句來過濾結果集
(3)Using filesort 使用文件排序,使用非索引列進行排序時出現,非常消耗性能,盡量優化。
(4)Using temporary 使用了臨時表 sql優化的目標可以參考阿里開發手冊
【推薦】SQL性能優化的目標:至少要達到 range 級別,要求是ref級別,如果可以是consts最好。
說明:1) consts 單表中最多只有一個匹配行(主鍵或者唯一索引),在優化階段即可讀取到數據。
2) ref 指的是使用普通的索引(normal index)。
3) range 對索引進行范圍檢索。反例:explain表的結果,type=index,索引物理文件全掃描,速度非常慢,這個index級別比較range還低。
最后,小編分類整理了許多java進階學習材料和BAT面試給熱愛IT行業的你,如果需要資料的請轉發此文章后再私聊小編回復【java】就能領取2019年java進階學習資料和BAT面試題以及《Effective Java》(第3版)電子版書籍。也可以加群:712263501領取海量學習資料進行學習。
總結
以上是生活随笔為你收集整理的MySQL面试题 | 附答案解析(十五)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL面试题 | 附答案解析(十四)
- 下一篇: MySQL面试题 | 附答案解析(十六)