日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Mysql优化之执行计划查看

發(fā)布時間:2023/12/20 数据库 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mysql优化之执行计划查看 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

我們經(jīng)常說到mysql優(yōu)化,優(yōu)化中一種常見的方式就是對于經(jīng)常查詢的字段創(chuàng)建索引。那么mysql中有哪些索引類型呢?

一、索引分類
1、普通索引:即一個索引只包含單個列,一個表可以有多個單列索引

2、唯一索引:索引列的值必須唯一,但允許有空值

3、復合索引:即一個索引包含多個列

4、聚簇索引(聚集索引):并不是一種單獨的索引類型,而是一種數(shù)據(jù)存儲方式。具體細節(jié)取決于不同的實現(xiàn),InnoDB的聚簇索引其實就是在同一個結(jié)構(gòu)中保存了B-Tree索引(技術(shù)上來說是B+Tree)和數(shù)據(jù)行。

5、非聚簇索引:不是聚簇索引,就是非聚簇索引

?

二、基本語法

查看索引
SHOW INDEX FROM table_name

創(chuàng)建索引
CREATE [UNIQUE ] INDEX indexName ON mytable(columnname(length));
ALTER TABLE 表名 ADD [UNIQUE ] INDEX [indexName] ON (columnname(length))

刪除索引
DROP INDEX [indexName] ON mytable;

上面講了創(chuàng)建索引的基本語法,現(xiàn)在處理講一下如何查看執(zhí)行計劃。


執(zhí)行計劃:使用EXPLAIN關(guān)鍵字可以模擬優(yōu)化器執(zhí)行SQL查詢語句,從而知道MySQL是如何處理你的SQL語句的。分析你的查詢語句或是表結(jié)構(gòu)的性能瓶頸

執(zhí)行計劃的作用:1、表的讀取順序,2、數(shù)據(jù)讀取操作的操作類型/? ?3、哪些索引可以使用,哪些索引被實際使用? ??4、表之間的引用? ? 5 、每張表有多少行被優(yōu)化器查詢

執(zhí)行計劃包含的信息有:

?

執(zhí)行計劃-ID

select查詢的序列號,包含一組數(shù)字,表示查詢中執(zhí)行select子句或操作表的順序

有三種情況:
(1)、id相同,執(zhí)行順序由上至下
(2)、id不同,如果是子查詢,id的序號會遞增,id值越大優(yōu)先級越高,越先被執(zhí)行
(3)、id相同不同,同時存在

執(zhí)行計劃-select_type:查詢的類型,主要是用于區(qū)別,普通查詢、聯(lián)合查詢、子查詢等的復雜查詢

?

?


執(zhí)行計劃-type
type顯示的是訪問類型,是較為重要的一個指標,結(jié)果值從最好到最壞依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

常見的為: system>const>eq_ref>ref>range>index>ALL

system:表只有一行記錄(等于系統(tǒng)表),這是const類型的特列,平時不會出現(xiàn),這個也可以忽略不計

const:表示通過索引一次就找到了,const用于比較primary key或者unique索引。因為只匹配一行數(shù)據(jù),所以很快如將主鍵置于where列表中,MySQL就能將該查詢轉(zhuǎn)換為一個常量

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

range:只檢索給定范圍的行,使用一個索引來選擇行。key 列顯示使用了哪個索引,一般就是在你的where語句中出現(xiàn)了between、<、>、in等的查詢
? ? ? ? ? ? ? 這種范圍掃描索引掃描比全表掃描要好,因為它只需要開始于索引的某一點,而結(jié)束語另一點,不用掃描全部索引。

all:Full Table Scan,將遍歷全表以找到匹配的行

執(zhí)行計劃-possible_keys : 實際使用的索引。如果為NULL,則沒有使用索引,查詢中若使用了覆蓋索引,則該索引和查詢的select字段重疊

執(zhí)行計劃-key_len :表示索引中使用的字節(jié)數(shù),可通過該列計算查詢中使用的索引的長度。在不損失精確性的情況下,長度越短越好
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? key_len顯示的值為索引字段的最大可能長度,并非實際使用長度,即key_len是根據(jù)表定義計算而得,不是通過表內(nèi)檢索出的

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?根據(jù)這個值,就可以判斷索引使用情況,特別是在組合索引的時候,判斷所有的索引字段是否都被查詢用到。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? char和varchar跟字符編碼也有密切的聯(lián)系,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? latin1占用1個字節(jié),gbk占用2個字節(jié),utf8占用3個字節(jié)。(不同字符編碼占用的存儲空間不同)

?

?

?

?

?

?

?

?

字符類型:索引字段為char + 不為 null:

?

字符類型:索引字段為char + 允許為 null:

?

索引字段為varchar類型+不可為Null時:

?


索引字段為varchar類型+允許為Null時:

?

?

?

?

?

整數(shù)/浮點數(shù)/時間類型的索引長度?:NOT NULL=字段本身的字段長度,NULL=字段本身的字段長度+1(因為需要有是否為空的標記,這個標記需要占用1個字節(jié))
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?datetime類型在5.6中字段長度是5個字節(jié),datetime類型在5.5中字段長度是8個字節(jié)

key_len 總結(jié):
變長字段需要額外的2個字節(jié)(VARCHAR值保存時只保存需要的字符數(shù),另加一個字節(jié)來記錄長度(如果列聲明的長度超過255,則使用兩個字節(jié)),所以VARCAHR索引長度計算時候要加2),固定長度字段不需要額外的字節(jié)。
而NULL都需要1個字節(jié)的額外空間,所以索引字段最好不要為NULL,因為NULL讓統(tǒng)計更加復雜并且需要額外的存儲空間。
復合索引有最左前綴的特性,如果復合索引能全部使用上,則是復合索引字段的索引長度之和,這也可以用來判定復合索引是否部分使用,還是全部使用。

?

執(zhí)行計劃-ref : 顯示索引的哪一列被使用了,如果可能的話,是一個常數(shù)。哪些列或常量被用于查找索引列上的值

執(zhí)行計劃-rows:根據(jù)表統(tǒng)計信息及索引選用情況,大致估算出找到所需的記錄所需要讀取的行數(shù)

執(zhí)行計劃-Extra:包含不適合在其他列中顯示但十分重要的額外信息

?

?

Using filesort 說明mysql會對數(shù)據(jù)使用一個外部的索引排序,而不是按照表內(nèi)的索引順序進行讀取。MySQL中無法利用索引完成的排序操作稱為“文件排序”
Using temporary:使了用臨時表保存中間結(jié)果,MySQL在對查詢結(jié)果排序時使用臨時表。常見于排序 order by 和分組查詢 group by

USING index :表示相應的select操作中使用了覆蓋索引(Covering Index),避免訪問了表的數(shù)據(jù)行,效率不錯,如果同時出現(xiàn)using where,表明索引被用來執(zhí)行索引鍵值的查找,
如果沒有同時出現(xiàn)using where,表明索引用來讀取數(shù)據(jù)而非執(zhí)行查找動作

?

?

?

? ??

?

轉(zhuǎn)載于:https://www.cnblogs.com/cheng21553516/p/11403378.html

總結(jié)

以上是生活随笔為你收集整理的Mysql优化之执行计划查看的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。