MySQL 查詢優化器有幾個目標,但是其中最主要的目標是儘可能地使用索引,並且使用最嚴格的索引來消除儘可能多的數據行。最終目標是提交 SELECT 語句查找數據行,而不是排除數據行。優化器試圖排除數據行的原因在於它排除數據行的速度越快,那麼找到與條件匹配的數據行也就越快。如果能夠首先進行最嚴格的測試 ...
MySQL 查詢優化器有幾個目標,但是其中最主要的目標是儘可能地使用索引,並且使用最嚴格的索引來消除儘可能多的數據行。最終目標是提交 SELECT 語句查找數據行,而不是排除數據行。優化器試圖排除數據行的原因在於它排除數據行的速度越快,那麼找到與條件匹配的數據行也就越快。如果能夠首先進行最嚴格的測試,查詢就可以執行地更快。
MySql 深化學習
可參考:
https://blog.csdn.net/qq_38056704/article/details/80030485
https://blog.csdn.net/windanchaos/article/details/78806462
1 explain用法
explain可以幫助我們分析select語句,找出select語句的瓶頸,從而可以針對性地去做優化,讓MySQL查詢優化器更好地工作。
MySQL查詢優化器有幾個目標,其中最主要的目標是儘可能地使用索引,並且使用最嚴格的索引來消除儘可能多的數據行。
使用explain+select語句,會返回以下的一個表,截圖使用的navicat的工具截圖:
下麵對上述表的每一列進行說明:
1.1 id列
說明:MySQL Query Optimizer 選定的執行計劃中查 詢的序列號。表示查詢中執行 select 子句或 操作表的順序,id 值越大優先順序越高,越先 被執行。id 相同,執行順序由上至下。
1.2 select_type列
select_type查詢類型
說明
SIMPLE
簡單的select查詢,不使用union及子查詢
PRIMARY
最外層的select查詢
UNION
UNION中的第二個或隨後的select查詢,不依賴外部查詢的結果集
DEPENDENT UNION
UNION 中的第二個或隨後的 select 查詢,依賴於外部查詢的結果集
UNION RESULT
UNION 查詢的結果集
SUBQUERY
子查詢中的第一個 select 查詢,不依賴於外部查詢的結果集
DEPENDENT SUBQUERY
子查詢中的第一個 select 查詢,依賴於外部 查詢的結果集
DERIVED
用於 from 子句里有子查詢的情況。MySQL 會 遞歸執行這些子查詢,把結果放在臨時表裡。
UNCACHEABLE SUBQUERY
結果集不能被緩存的子查詢,必須重新為外 層查詢的每一行進行評估
UNCACHEABLE UNION
UNION 中的第二個或隨後的 select 查詢,屬 於不可緩存的子查詢
1.3 TABLE列
說明:輸出行所引用的表。
1.4 TYPE
說明:很重要的列之一,顯示連接使用的類型,按最優到最差的類型排序。
TYPE
說明
system
表僅有一行(=系統表)。這是 const 連接類型 的一個特例。
const
const 用於用常數值比較 PRIMARY KEY 時。當 查詢的表僅有一行時,使用 System。
eq_ref
除 const 類型外最好的可能實現的連接類型。它用在一個索引的所有部分被連接使用並且索引是 UNIQUE 或 PRIMARY KEY,對於每個索引鍵,表中只有一條記錄與之匹配。
ref
連接不能基於關鍵字選擇單個行,可能查找到多個符合條件的行。叫做 ref 是因為索引要跟某個參考值相比較。這個參考值或者是一個常數,或者是來自一個表裡的多表查詢的
結果值。
ref_or_null
如同 ref,但是 MySQL 必須在初次查找的結果
里找出 null 條目,然後進行二次查找。
index_merge
說明索引合併優化被使用了。
unique_subquery
在某些IN查詢中使用此種類型,而不是常規的ref
index_subquery
在某些IN查詢中使用此種類型,與unique_subquery類似,但是查詢的是非唯一性索引。
range
只檢索給定範圍的行,使用一個索引來選擇行。key列顯示使用了哪個索引。
index
全表掃描,只是掃描表的時候按照索引次序進行而不是行。主要優點是避免了排序,但是開銷仍然非常大。
all
最壞的情況,從頭到尾全表掃描。
1.5 possible_keys
說明:指出Mysql能在該表中使用哪些索引有助於查詢。如果為空,說明沒有可用的索引。
1.6 key_len
說明:使用的索引的長度,在不損失精確性的情況下,長度越短越好。
1.7 ref
說明:顯示索引的那一列被使用了。
1.8 rows
說明:Mysql認為必須檢查的用來返回請求數據的行數。
1.9 extra
Using filesort
表示MySQL會對結果使用一個外部索引排序,而不是從表裡按索引次序讀到相關內容。
Using Temporary
表示MySQL在對查詢結果排序時使用臨時表,常見於排序order by和分組查詢group by.
至於如何去獲取到業務流程中的sql語句,這就需要結合自己公司的實際情況了。
我們公司的日誌是使用log4j,開啟debug模式,每一個操作都會把日誌列印出來,包括mysql。對核心可能存在併發的地方。逐一去排查還是有點作用的。
實操一個:
下圖是我在某業務日誌中捕獲的(所謂捕獲,就是不斷的check)
在當前數據規模下查0.053s。但是如果數據規模一大,這個效率肯定是不行的。
我去看了下的索引,order_id沒有索引。所以,讓研發加了一個order_id 索引。解決問題。
---------------------
作者:windanchaos
來源:CSDN
原文:https://blog.csdn.net/windanchaos/article/details/78806462
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!