explain + sql語句:explain select * from table_name
查詢結果如下:
(1)id:selectct 查詢的序列號,包含一組數字,表示查詢中執行select子句或操作表的順序(查詢順序)
(a)id相同,執行順序由上至下
(b)id不同,如果是子查詢,id的序號會遞增,id值越大,優先順序越高,越先被執行
(c)id相同不同,同時存在
(2)select_type:表示查詢的型別
1、******:簡單的select查詢,查詢中不包含子查詢或union
2、primary:查詢中若包含任何複雜的子部分,最外層查詢則標記為primary
3、subquery:在select或where列表中包含了子查詢
4、derived:在from列表中包含的子查詢被標記為derived(衍生),mysql會遞迴執行這些子查詢,把結果放在臨時表裡
5、union:若第二個select出現在union之後,則被標記為union
6、union result:從union表中獲取結果的select
(3)table:顯示這一行的資料是於哪張表的來自(4) partitions:使用的哪個分割槽,需要結合表分割槽才可以看到(5)type:表示按某種型別來查詢,例如按照索引型別查詢,按照範圍查詢該值表示查詢的sql語句好壞,從最好到最差依次為:system>const>eq_ref>ref>range>index>all
1、system:表中只有一行記錄,這是const型別的特列
2、const:表示通過索引一次就能查到了,const用於比較primary key或unique索引,因為只匹配一行資料,所以很快,如將主鍵置於where列表中,mysql就能將該查詢轉換為乙個常量
3、eq_ref:唯一性索引掃瞄,對於每個索引鍵,表中只有一條與之匹配常見於主鍵或唯一索引掃瞄
4、ref:非唯一性索引掃瞄,返回匹配某個單獨值的所有行,本質上也是一種索引訪問,它返回所有匹配某個單獨的行,然而,它可能找到多個符合條件的行,所以它應該屬於查詢和掃瞄的混合體
5、range:只檢索給定範圍的行,使用乙個索引來選擇行,一般就是在where語句**現betwent、、in等查詢中,這種範圍掃瞄索引掃瞄比全表掃瞄要好,因為它只需要開始與索引的某乙個點,而結束於另乙個點,不用掃瞄全部索引
6、index:full index scan,index與all區別為index型別只遍歷索引樹,這通常比all快,因為索引檔案通常比資料檔案小
7、all:full table scan,將遍歷全表以找到匹配的行
備註:一般來說,保證查詢至少到達range級別,最好能到達ref
(6)possible_keys:顯示可能應用在該表中的索引,如果是多個索引的話,用逗號隔開,但查詢時不一定被實際應用到(7)key:查詢時實際使用到的索引,如果為null,則沒有使用到索引;若查詢時使用了覆蓋索引,則該索引和查詢的select欄位重疊(8)key_len:表示索引中使用的位元組數,可通過該列計算查詢中使用的索引長的,長度越短越好(9)ref:顯示索引的哪一列被使用了,如果可能的話,是乙個常數,哪些列或常數被用於查詢索引列上的值
(10)rows:查詢時大致估算出找到所需的記錄,所需要讀取的總行數
(11)filtered:通過過濾條件之後對比總數的百分比
(12)extra:包含不適合在其他列中顯示但十分重要的額外資訊
(1)了解表的讀取順序(表的執行順序)>id
(2)資料讀取操作的操作型別(如:子查詢等)>select_type、type
(3)查詢中哪些索引可以使用 >possible_keys
(4)查詢中哪些索引被實際使用到 >key
(5)表之間的引用 >table
(6)每張表有多少行被優化器查詢 >rows
(1)全值匹配我最愛,即where條件按照索引的順序查詢,效果最佳(組合索引時,最前索引不能丟)
(2)最佳左前輟法則,如果為組合索引,要遵守最左前輟法則,查詢時從索引的最左前列開始並且不跳過索引中的列(不按索引順序檢索容易導致索引失效)
(3)不在索引列上做任何的操作(計算、函式、型別轉換等),會導致索引失效而轉向全表掃瞄
(4)儲存引擎不能使用索引中範圍條件右邊的列,即索引中查詢條件存在範圍時,索引將會失效
(5)盡量使用覆蓋索引,即只訪問索引的查詢(索引列跟查詢列一致),減少select *
(6)mysql在使用不等於(!= 或<>)的時候無法使用索引會導致全表掃瞄(可通過覆蓋索引方式解決)
(7)is null或is not null也是無法使用索引的(可通過覆蓋索引方式解決)
(8)like以萬用字元開頭('%test%'),mysql索引失效會變成全表掃瞄,但是索引支援右模糊查詢,即like 'test%'(可通過覆蓋索引方式解決)
(9)字串不加單引號索引失效(mysql會自動型別轉換,導致索引失效)
(10)少用or,用它來連線時會索引失效(可通過覆蓋索引方式解決)
(1)經常作為條件的字段應新增索引,多個則建立組合索引
(2)多表關聯查詢時,保證join語句中被驅動表上join條件字段已經被索引(建立索引)
(3)永遠用小結果集驅動大的結果集(即小表驅動大表)
索引優化分析(三)
是mysql提供的一種日誌記錄,用來記錄在mysql中響應時間超過閾值的語句,具體指執行時間超過long query time值的sql,則會被記錄到慢查詢日誌中 long query time的預設值為10s,sql語句執行超過10s,則記錄下來,在結合explain sql語句分析。1 檢視是否...
MySQL索引優化分析
1.通過訂單號查詢某個訂單,用唯一索引 資料量幾百萬以上 2.order by 排序時,後面欄位加 強制指定索引 select from orderforce index idx ordere order by order level,input date 哪些情況需要建索引 1 主鍵,唯一索引 2...
多表索引優化分析
圖為兩張表 左連線用右表索引 select from class left join book on class.card book.card 那麼索引應該建在右表book的card欄位。右連線用左表索引 如果索引已然建立在class的card欄位上,那麼使用select from book rig...