mysql索引執行計畫 MySQL索引及執行計畫

2021-10-18 23:48:27 字數 2811 閱讀 3410

mysql索引及執行計畫

索引合理的建立索引可以加快資料查詢,例如,學校圖書管為每一本書編號,根據編號可以快速鎖定一本書所在位置。mysql索引預設b+樹索引。索引雖然能夠提高檢索效率,但同時也會降低更新的速度,因為insert 、update、delete也會操作索引檔案,會調整因為更新等操作帶來的鍵值變化後的索引資訊。

索引型別

主鍵索引:唯一索引,並且並指定為primary key,每個表中只能有乙個主鍵

唯一索引:索引列的所有值都只能出現一次,即值必須唯一,值可以為空

普通索引:基本的索引型別,值可以為空,沒有唯一性限制

復合索引:乙個索引中包含多個列

何時建立索引

主鍵自動建立唯一索引

頻繁作為查詢條件的字段適合建立索引

查詢中與其他表關聯的字段適合建立索引

頻繁更新的字段不適合建立索引,因為在更新記錄的同時會更新索引

where條件中使用不到的字段不需要建立索引

在高併發下,在單值索引和復合索引中,復合索引更合適

order by欄位新增索引可以提高排序速度

不需要索引

表記錄較少

經常增刪改的表

資料重複且分布平均的表,如性別

執行計畫

可以使用explain 關鍵字模擬優化器執行sql查詢語句,從而分析查詢語句或者表結構的效能瓶頸。

通過檢視執行計畫,可以了解到表的讀取順序、資料讀取操作、哪些索引可以使用、哪些索引被實際使用、表之間的引用、每張表中有多少行被優化器查詢

explain select * from tz_order a left join tz_order_item b on b.order_number = a.order_number where b.order_number = 1146347329394184192

idselect_type

table

partitions

type

possible_keys

keykey_len

refrows

filtered

extra

******

ball

order_number

14.29

using where

******

aeq_ref

order_number_unique_ind

order_number_unique_ind

yami_shops.b.order_number

id表示實際操作中載入表的順序,可以相同也可以不相同,如果id相同則從上往下依次載入執行,不相同則id越大對應的表越先載入。

select_type

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

primary:查詢中若包含任何複雜的子查詢,最外層的最後載入的標記為此

subquery:在select或者where中包含子查詢

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

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

union result:從union表中獲取結果的select

type

system:表中只有一條記錄

const:表示通過索引一次就可以找到,用於主鍵索引或者唯一索引。因為只需要匹配一行,查詢速度往往很快,mysql可以將該查詢轉換成乙個常量

eq_ref:唯一索引掃瞄,對於每個索引鍵,表中只有一條記錄與之匹配,用於主鍵索引或者唯一索引

ref:非唯一索引掃瞄,返回匹配某個單獨值的所有行,本質上也是一種索引訪問,返回所有匹配某個單獨值的行,可能找到多行。

rang:只檢索給定範圍的行,使用乙個索引來選擇行,一般where中使用了、in、between這種範圍掃瞄。

index:index只遍歷所引樹,因為索引檔案比資料檔案小,所以讀取索引檔案比讀全表快。

all:全表掃瞄,從硬碟讀取

possible_key

可能應用到這張表的索引,查詢涉及到的字段上若存在索引,則列出,但是不一定會使用。

key實際使用到的索引,如果是null,則沒有使用索引,如果查詢中使用了覆蓋索引,則該索引僅會出現在key列表中

key_len

表示索引中使用的位元組數,計算查詢中索引的長度,在不損失精度的情況下,越小越好,這個值顯示的是索引欄位的最大可能長度,不是實際長度

ref顯示索引的哪一列被使用

rows

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

extra

using filesort:mysql會對資料使用乙個外部索引排序,而不是按照表內的索引進行讀取,mysql中無法利用索引完成的排序操作叫做檔案排序

using temporary:使用了臨時表儲存中結果,mysql對查詢結果排序使用了臨時表。一般來說,是因為order by排序或者分組查詢group by時候沒有按照索引走。使用了臨時表,更加嚴重影響效率。

using index:表示相應的select操作中使用到了覆蓋索引,避免訪問表的資料行。如果同時出現using where,表示索引被用來執行索引值的查詢,沒有同時出現 using where表示索引用來讀取資料而非執行查詢。

表驅動select * from a where id in (select id from b) --> b的資料小於a

select * from b where exists (select 1 from a where a.id = b.id) ---> b的資料小於a

MySQL索引和執行計畫

索引 index 是幫助mysql高效獲取資料的資料結構。可以得到索引的本質 索引是資料結構 右側是資料表,一共有兩列七條記錄,最左邊的是資料記錄的實體地址 show index from table namecreate unique index indexname on mytable colu...

Mysql 索引和執行計畫

平衡二叉樹示意圖。聚簇索引 輔助索引 單列索引 聯合索引 i ndex a,b,c 查詢條件一定要帶a才能走索引 最左列 字首索引 由於索引列,字元太長,占用空間太大,索引樹高度增高。查詢時需要檢索更多的索引也。mysql中建議3,4層。所以可以選擇大字段的前部分作索引。2.資料庫行過多 1.索引欄...

Mysql 索引和執行計畫

平衡二叉樹示意圖。聚簇索引 輔助索引 單列索引 聯合索引 i ndex a,b,c 查詢條件一定要帶a才能走索引 最左列 字首索引 由於索引列,字元太長,占用空間太大,索引樹高度增高。查詢時需要檢索更多的索引也。mysql中建議3,4層。所以可以選擇大字段的前部分作索引。2.資料庫行過多 1.索引欄...