索引優化分析(二)

2021-10-03 01:17:14 字數 3153 閱讀 3286

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...