mysql高階 索引優化分析

2021-10-05 17:51:27 字數 3528 閱讀 5144

2、效能分析(explain)

3、索引優化

【筆記於學習尚矽谷課程所作】

慢查詢的開啟並捕獲

explain+慢sql分析

showprofile查詢sql在mysq1伺服器裡面的執行細節和生命週期情況

sql資料庫伺服器的引數調優。

​  mysql官方對索引的定義為:索引(index) 是幫助mysql高效獲取資料的資料結構。

​ 索引的本質:索引是資料結構

簡單理解為「排好序的快速查詢資料結構」。

​  資料本身之外,資料庫還維護著乙個滿足特定查詢演算法的資料結構,這些資料結構以某種方式指向資料,這樣就可以在這些資料結構的基礎上實現高階查詢演算法,這種資料結構就是索引。

​  一般來說索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存的磁碟上。

​  我們平常所說的索引,如果沒有特別指明,都是指b樹(多路搜尋樹,並不- -定是二叉的)結構組織的索引。

​  索引的分類:單值索引、唯一索引、復合索引

​  索引的結構:btree索引、hash索引、full-text全文索引、r-tree索引

建立索引1

create

[unique

]index indexname on mytable(columnname(length));

建立索引2

alter mytable add

[unique

]index

[indexname]

on(columnname(length))刪除

drop

index

[indexname]

on mytable;

檢視show

index

from table_ name\g

​  使用explain關鍵字可以模擬優化器執行sql查詢語句,從而知道mysql是如何處理你的sql語句的。分析你的查詢語句或是表結構的效能瓶頸。

​ 具體功能:

如何使用:explain+sql語句

字段解釋

idselect查詢的序列號,包含一組數字,表示查詢中執行select子句或操作表的順序

select_type

查詢的型別

table

顯示這一行的資料是關於哪張表的

type

顯示查詢使用了哪種訪問型別

possible_keys

顯示可能應用在這張表中的索引,乙個或多個。(不一定被實際使用)

key實際使用的索引。如果為null,則沒有使用索引。(查詢中若使用了覆蓋索引,則該索引和查詢的select欄位重疊)

key_len

表示索引中使用的位元組數,可通過該列計算查詢中使用的索引的長度。在不損失精確性的情況下,長度越短越好。(顯示的值為索引欄位的最大可能長度,並非實際使用長度,即key_ len是根據表定義計算而得,不是通過表內檢索出的)

ref顯示索引的哪一列被使用了, 如果可能的話。是乙個常數。哪些列或常量被用於查詢索引列上的值。

rows

根據表統計資訊及索引選用情況,大致估算ib找到所需的記錄所需要讀取的行數。

extra

包含不適合在其他列中顯示但十分重要的額外資訊

​ 查詢的型別,主要是用於區別普通的查詢、聯合查詢、子查詢等的複雜查詢

idselect_type含義1

******

簡單的select查詢,查詢中不包含子查詢或者union

2primary

查詢中若包含任何複雜的子部分,最外層查詢則被標記為

3subquery

在select或where列表中包含了子查詢

4derived

在from列表中包含的子查詢被標記為derived(衍生)。mysql會遞迴執行這些子查詢,把結果放在臨時表裡。

5union

若第二個select出現在union之後,則被標記為union。若union包含在from子句的子查詢中,外層select將被標記為: derived

6union result

從union表獲取結果的select

​ 顯示查詢使用的訪問型別。

​ 從好到壞依次是:system>const>eq_ ref>ref>range>index>all

​ 一般來說,要保證查詢至少達到range級別,最好能達到ref.

型別含義

system

表只有一.行記錄 (等於系統表),這是const型別的特列,平時不會出現,這個也可以忽略不計

const

表示通過索引一次就找到了,const用於比較primary key或者unique索引。因為只匹配一行資料,所以很快。(如將主鍵置於where列表中,mysql就能將該查詢轉換為乙個常量)

eq_ ref

唯一性索引掃瞄,對於每個索引鍵,表中只有條記錄與之匹配。常見於主鍵或唯一索引掃瞄

ref非唯一性索引掃瞄,返回匹配某個單獨值的所有行。(本質上也是一種索引訪問,它返回所有匹配某個單獨值的行,然而,它可能會找到多個符合條件的行,所以他應該屬於查詢和掃瞄的混合體)

range

只檢索給定範圍的行,使用乙個索引來選擇行。key 列顯示使用了哪個索引。(一般就是在你的where語句**現了between、、in等的查詢)

index

full index scan, index 與all區別為index型別只遍歷索引樹。這通常比all快,因為索引檔案通常比資料檔案小。(也就是說雖然ll和index都是讀全表,但index 是從索引中讀取的,而all是 從硬碟中讀的)

allfull table scan,將遍歷全表以找到匹配的行

using flesort:(檔案內排序【壞】)說明mysql會對資料使用乙個外部的索引排序,而不是按照表內的索引順序進行讀取。mysql中無法利用索引完成的排序操作稱為"檔案排序」。

using temporary:(使用臨時表【壞】)使了用臨時表儲存中間結果,mysql在對查詢結果排序時使用臨時表。常見於排序order by和分組查詢group by.

using index:(使用了覆蓋索引【好】)表示相應的select操作中使用了覆蓋索引(covering index), 避免訪問了表的資料行(如果同時出現using where,表明索引被用來執行索引鍵值的查詢;如果沒有同時出現usingwhere,表明索引用來讀取資料而非執行查詢動作)

using where:表明使用了where過濾

using join buffer:使用了連線快取

…口訣:

全值匹配我最愛,最左字首要遵守;

帶頭大哥不能死,中間兄弟不能斷;

索引列上少計算,範圍之後全失效;

like百分寫最右,覆蓋索引不寫星;

不等空值還有or,索引失效要少用;

var引號不可丟,sql高階也不難;

MySQL高階 索引優化分析

二.效能分析 4 explain欄位解釋 select type 5 explain欄位解釋 table 6 explain欄位解釋 type 7 explain欄位解釋 possible keys 8 explain欄位解釋 key 9 explain欄位解釋 key len 10 explain...

MySQL索引優化分析

1.通過訂單號查詢某個訂單,用唯一索引 資料量幾百萬以上 2.order by 排序時,後面欄位加 強制指定索引 select from orderforce index idx ordere order by order level,input date 哪些情況需要建索引 1 主鍵,唯一索引 2...

MySQL索引優化分析(四)

1.order by子句,盡量使用index方式排序,避免使用filesort方式排序 a.mysql支援兩種方式的排序,filesort和index,index效率高 它指mysql掃瞄索引本身完成排序。filesort效率低。b.order by 滿足兩種情況,會使用index方式排序 1,or...