1.我們怎麼知道sql執行效果怎樣哪?我們需要查詢sql的執行計畫。mysql優化器是怎樣執行我們的請求的。
explain select * from user where username = 'lai' and password = 'lai';
2.首先通過mysql執行計畫,我們可以知道sql如何使用索引。雖然我們在列上加了索引,但是sql執行過程中未必走索引。所以我們需要通過執行計畫確認是否正確使用到了索引。
此外我們還可以知道多表鏈結查詢時,表鏈結順序。mysql執行計畫會根據索引動態調整表關聯順序。同時我們還可以知道當前sql需要掃瞄的資料行數。有時返回的結果集中僅僅只有幾行資料,但是卻要掃瞄幾百或上前萬行資料。
也就是說沒有正確使用到索引。
3.mysql執行計畫可能輸出多行,每一行對乙個資料庫物件的操作。按照執行計畫的輸出順序看sql告訴我們那些內容。
3.1 id列中的資料有兩種情況:
(1)一組數字:1,2,3,4;表示sql語句對於資料庫的操作順序。
(2)null這樣行資料由另外兩個語句union執行後的結果集。
那麼既然id值表示sql執行順序,id值相同的情況說明執行順序由上至下。
id值不相同,那麼表示id值越高優先順序越高,優先被執行。id值可以看作sql中select操作的序號。第乙個select語句序號1,第二個select語句序號2。這樣由上至下執行。
3.2select_type列
******不包含子查詢或是union操作的查詢
primary查詢中如果包含任何子查詢,那麼最外層的查詢則被標記為primary。
subqueryselect 列表中的子查詢
dependentsubquery 依賴外部結果的子查詢
unionunion操作的第二個或是之後的查詢(select)的值為union
dependentunion 當union作為子查詢時,第二個或是第二個後的查詢的select_type值
unionresult union產生的結果集。
derived 出現在from子字句的子查詢
3.3table列
輸出資料行所在的表名稱。(表名或別名)
由id為m,n查詢union產生的結果集。
/由id為n的查詢產生的結果集。
3.4partutuibs列
對於分割槽表,顯示查詢分割槽的id。查詢到結果所查詢到的所有分割槽id。
若沒有分割槽,顯示null.
3.5type列
mysql預設所有的查詢都是關聯查詢。效能值
說明高system
這是const鏈結型別的乙個特例,當查詢的表只有一行資料時使用
constant
表中由且只有乙個匹配的行。如對主鍵或者唯一索引的查詢。
eq_ref
唯一索引或主鍵索引查詢。每乙個索引鍵,表中只有一條記錄匹配
ref非唯一索引查詢,返回匹配某個單獨值的所有行
ref-or-null
類似於ref型別的索引。但是附加了對null值列的查詢。
index-marge
使用了索引合併優化方法
range
索引範圍掃瞄,常見與bewteen,<,>這樣的查詢
index
full index scan全索引掃瞄,同all的區別是遍歷的是索引數
allfull table scan全表掃瞄
3.7擴充套件列extra值含義
distinct
優化distinct操作,在找到第乙個匹配的元素後即停止找相同值的動作
not exists
使用not exists來優化。例如優化not in
using filesort
使用額外操作進行排序,通常會出現在orderby groupby中
using index
使用了覆蓋索引進行查詢
using temporary
mysql需要使用臨時表來查詢,常見於排序,子查詢,分組查詢
using where
需要在mysql伺服器層使用where條件來過濾
select tables optimized away
直接通過索引來獲取資料。不用訪問表。
3.8 possible_keys列
指出mysql能使用哪些索引來優化查詢,但是可能沒有使用。
3.9 key列
查詢優化器優化查詢實際所使用的索引。沒有則顯示null.
3.10 key_len列
mysql在索引裡所使用的位元組數。在聯合索引中有3列,3列的字段長度可能是100個位元組,key_len可能小於100個位元組,這說明聯合索引沒有用到所有的列,利用到其中1~2列。
key_len的長度是用字段定義來決定的並非資料的實際長度。
3.11 ref列
表示哪些列或常量被用於索引查詢列上的值。換句話說就是查詢所利用的索引值**於哪些列或者常量。
3.12 rows列
mysql通過索引統計資訊,估算出所需讀取的行數。在關聯查詢的時候rows列所顯示的行數是每一次巢狀查詢時所需要查詢的行數。
rows值的大小是統計抽樣的結果,並非十分準確。
3.13 filtered
表示返回結果的行數佔需要讀取行數的百分比。參考值,並非十分準確。
4.執行計畫的限制
無法展示儲存過程,觸發器,udf對查詢的影響。
建立聯合索引的第一步就是確定區分度:
selectcount(distinct name)/count(1) from user;
selectcount(distinct phone)/count(1) from user;
區分度越大表示相同資料越少。
createindex idx_phone_name on user(phone, name)
SQL執行計畫
引言 實際專案開發中,由於我們不知道實際查詢的時候資料庫裡發生了什麼事情,資料庫軟體是怎樣掃瞄表 怎樣使用索引的,因此,我們能感知到的就只有 sql語句執行的時間,在資料規模不大時,查詢是瞬間的,因此,在寫sql語句的時候就很少考慮到效能的問題。但是當資料規模增大,如千萬 億的時候,我們運 行同樣的...
SQL 執行計畫
使用explain關鍵字可以模擬優化器執行sql查詢語句,從而知道mysql是如何處理你的sql語句的。分析你的查詢語句或是表結構的效能瓶頸 l 表的讀取順序 l 資料讀取操作的操作型別 l 哪些索引可以使用 l 哪些索引被實際使用 l 表之間的引用 l 每張表有多少行被優化器查詢 explian ...
hive執行計畫解析
3.sql執行計畫對映mr流程 4.執行計畫優化 2.1 大資料兩類sql框架 這兩種sql框架,概括了所有的大資料sql,幾乎不可能有第三種寫法,區別可能是業務複雜,寫的複雜點兒而已。2.2 解析sql執行計畫流程詳解 六步將普通的sql對映成了作業任務。重點是 邏輯執行計畫優化和物理執行計畫優化...