Mysql 层级、执行顺序、执行计划分析
邏輯分層
下面是MySQL的邏輯分層圖:
連接層:連接與線程處理,這一層并不是MySQL獨(dú)有,一般的基于C/S架構(gòu)的都有類似組件,比如連接處理、授權(quán)認(rèn)證、安全等。
服務(wù)層:包括緩存查詢、解析器、優(yōu)化器,這一部分是MySQL核心功能,包括解析、優(yōu)化SQL語(yǔ)句,查詢緩存目錄,內(nèi)置函數(shù)(日期、時(shí)間、加密等函數(shù))的實(shí)現(xiàn)。
引擎層:負(fù)責(zé)數(shù)據(jù)存儲(chǔ),存儲(chǔ)引擎的不同,存儲(chǔ)方式、數(shù)據(jù)格式、提取方式等都不相同,這一部分也是很大影響數(shù)據(jù)存儲(chǔ)與提取的性能的;對(duì)存儲(chǔ)層的抽象。
存儲(chǔ)層:存儲(chǔ)數(shù)據(jù),文件系統(tǒng)。
?
存儲(chǔ)引擎
查看數(shù)據(jù)庫(kù)支持的存儲(chǔ)引擎:show engines;
如果要想查看數(shù)據(jù)庫(kù)默認(rèn)使用哪個(gè)引擎,可以通過(guò)使用命令:?show variables like '%storage_engine%';
InnoDB,MyISAM的主要區(qū)別:
InnoDB:在MySQL5.5開始作為默認(rèn)的存儲(chǔ)引擎,支持事務(wù),行級(jí)鎖,適合高并發(fā)場(chǎng)景,XA協(xié)議支持分布式事務(wù),事務(wù)優(yōu)先。
MyISAM:不支持事務(wù),性能優(yōu)先,表級(jí)鎖,不適合高并發(fā)場(chǎng)景。
sql執(zhí)行順序:https://www.cnblogs.com/annsshadow/p/5037667.html
?explain-執(zhí)行計(jì)劃
explain顯示了mysql如何使用索引來(lái)處理select語(yǔ)句以及連接表。可以幫助選擇更好的索引和寫出更優(yōu)化的查詢語(yǔ)句。
使用方法,在select語(yǔ)句前加上explain就可以了:
如:explain?select?surname,first_name?form?a,b?where?a.id=b.id?
EXPLAIN列的解釋:
id:情況有三種,分別是:id相同表示加載表的順序是從上到下。id不同id值越大,優(yōu)先級(jí)越高,越先被執(zhí)行。id有相同,也有不同,同時(shí)存在。id相同的可以認(rèn)為是一組,從上往下順序執(zhí)行;在所有的組中,id的值越大,優(yōu)先級(jí)越高,越先執(zhí)行。
table:顯示這一行的數(shù)據(jù)是關(guān)于哪張表的
type:這是重要的列,顯示連接使用了何種類型。
possible_keys:顯示可能應(yīng)用在這張表中的索引。但是并不表示此索引會(huì)真正地被 MySQL 使用到,如果為空,沒(méi)有可能的索引。
key: 實(shí)際使用的索引。如果為NULL,則沒(méi)有使用索引。很少的情況下,MYSQL會(huì)選擇優(yōu)化不足的索引。這種情況下,可以在SELECT語(yǔ)句中使用USE INDEX(indexname)來(lái)強(qiáng)制使用一個(gè)索引或者用IGNORE INDEX(indexname)來(lái)強(qiáng)制MYSQL忽略索引
key_len:使用的索引的長(zhǎng)度。在不損失精確性的情況下,長(zhǎng)度越短越好
ref:顯示索引的哪一列被使用了,如果可能的話,是一個(gè)常數(shù)
rows:MySQL 查詢優(yōu)化器根據(jù)統(tǒng)計(jì)信息, 估算 SQL 要查找到結(jié)果集需要掃描讀取的數(shù)據(jù)行數(shù).這個(gè)值非常直觀顯示 SQL 的效率好壞, 原則上 rows 越少越好.
Extra:關(guān)于MYSQL如何解析查詢的額外信息
select_type
select_type 表示了查詢的類型, 它的常用取值有:
-
SIMPLE, 表示此查詢不包含 UNION 查詢或子查詢
-
PRIMARY, 表示此查詢是最外層的查詢
-
UNION, 表示此查詢是 UNION 的第二或隨后的查詢
-
DEPENDENT UNION, UNION 中的第二個(gè)或后面的查詢語(yǔ)句, 取決于外面的查詢
-
UNION RESULT, UNION 的結(jié)果
-
SUBQUERY, 子查詢中的第一個(gè) SELECT
-
DEPENDENT SUBQUERY: 子查詢中的第一個(gè) SELECT, 取決于外面的查詢. 即子查詢依賴于外層查詢的結(jié)果.
最常見的查詢類別應(yīng)該是 SIMPLE 了, 比如當(dāng)我們的查詢沒(méi)有子查詢, 也沒(méi)有 UNION 查詢時(shí), 那么通常就是 SIMPLE 類型
type
type 字段比較重要, 它提供了判斷查詢是否高效的重要依據(jù)依據(jù). 通過(guò) type 字段, 我們判斷此次查詢是 全表掃描 還是 索引掃描 等,(常見的)從最好到最差的連接類型為const、eq_reg、ref、range、index和ALL
? type顯示的是訪問(wèn)類型,是較為重要的一個(gè)指標(biāo),結(jié)果值從好到壞依次是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL? ? ? ? ?一般來(lái)說(shuō),得保證查詢至少達(dá)到range級(jí)別,最好能達(dá)到ref。
-
system: 表中只有一條數(shù)據(jù). 這個(gè)類型是特殊的 const 類型.
-
const: 針對(duì)主鍵或唯一索引的等值查詢掃描, 最多只返回一行數(shù)據(jù). const 查詢速度非常快, 因?yàn)樗鼉H僅讀取一次即可
- eq_ref: 此類型通常出現(xiàn)在多表的 join 查詢, 表示對(duì)于前表的每一個(gè)結(jié)果, 都只能匹配到后表的一行結(jié)果. 并且查詢的比較操作通常是 =, 查詢效率較高.
- ref: 此類型通常出現(xiàn)在多表的 join 查詢, 針對(duì)于非唯一或非主鍵索引, 或者是使用了 最左前綴(索引使用順序和定義順序一致) 規(guī)則索引的查詢.
- range: 表示使用索引范圍查詢, 通過(guò)索引字段范圍獲取表中部分?jǐn)?shù)據(jù)記錄. 這個(gè)類型通常出現(xiàn)在 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN() 操作中.
當(dāng) type 是 range 時(shí), 那么 EXPLAIN 輸出的 ref 字段為 NULL, 并且 key_len 字段是此次查詢中使用到的索引的最長(zhǎng)的那個(gè).(in查詢時(shí)有時(shí)候會(huì)失效,從而變成無(wú)索引All) - index: 表示全索引掃描(full index scan), 和 ALL 類型類似, 只不過(guò) ALL 類型是全表掃描, 而 index 類型則僅僅掃描所有的索引, 而不掃描數(shù)據(jù).
index 類型通常出現(xiàn)在: 所要查詢的數(shù)據(jù)直接在索引樹中就可以獲取到, 而不需要掃描數(shù)據(jù). 當(dāng)是這種情況時(shí), Extra 字段 會(huì)顯示 Using index. - ALL: 表示全表掃描, 這個(gè)類型的查詢是性能最差的查詢之一. 通常來(lái)說(shuō), 我們的查詢不應(yīng)該出現(xiàn) ALL 類型的查詢, 因?yàn)檫@樣的查詢?cè)跀?shù)據(jù)量大的情況下, 對(duì)數(shù)據(jù)庫(kù)的性能是巨大的災(zāi)難. 如一個(gè)查詢是 ALL 類型查詢, 那么一般來(lái)說(shuō)可以對(duì)相應(yīng)的字段添加索引來(lái)避免.
Extra
EXplain 中的很多額外的信息會(huì)在 Extra 字段顯示, 常見的有以下幾種內(nèi)容:
-
Using filesort
當(dāng) Extra 中有 Using filesort 時(shí), 表示 MySQL 需額外的排序操作, 不能通過(guò)索引順序達(dá)到排序效果. 一般有 Using filesort, 都建議優(yōu)化去掉, 因?yàn)檫@樣的查詢 CPU 資源消耗大.
如果我們將排序依據(jù)改為 ORDER BY user_id, product_name, 那么就不會(huì)出現(xiàn) Using filesort 了
- Using index? "覆蓋索引掃描", 表示查詢?cè)谒饕龢渲芯涂刹檎宜钄?shù)據(jù), 不用掃描表數(shù)據(jù)文件, 往往說(shuō)明性能不錯(cuò)
- Using temporary 查詢有使用臨時(shí)表, 一般出現(xiàn)于排序, 分組和多表 join 的情況, 查詢效率不高, 建議優(yōu)化.
?優(yōu)化小結(jié):
轉(zhuǎn)載于:https://www.cnblogs.com/cuijj/p/10559605.html
總結(jié)
以上是生活随笔為你收集整理的Mysql 层级、执行顺序、执行计划分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: jmeter操作练习
- 下一篇: Cube painting UVA -