内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

Explain是怎么執(zhí)行MySQL語句的

這篇文章主要介紹“Explain是怎么執(zhí)行MySQL語句的”,在日常操作中,相信很多人在Explain是怎么執(zhí)行MySQL語句的問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Explain是怎么執(zhí)行MySQL語句的”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

創(chuàng)新互聯(lián)專注于揭陽網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供揭陽營銷型網(wǎng)站建設(shè),揭陽網(wǎng)站制作、揭陽網(wǎng)頁設(shè)計、揭陽網(wǎng)站官網(wǎng)定制、小程序開發(fā)服務(wù),打造揭陽網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供揭陽網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

Explain

在 MySQL 中,我們一般常用 desc tableName 來查看一張表的信息,各個列的定義等、通過 Explain SQL 來了解MySQL  是如何執(zhí)行當(dāng)前這條SQL的 。

實際上 desc、describe、explain 都可以用來查看MySQL 是如何執(zhí)行當(dāng)前這條SQL的,在 MySQL 8.0.19  之后,這三者的作用可以說是等價的,explain 也可以用來查看表信息。后面我們會直接以 explain 為例,來說明具體的作用。

官方文檔說的明白, explain 可以和SELECT、INSERT、UPDATE、DELETE 一起工作,顯示 MySQL  優(yōu)化器的語句執(zhí)行計劃,即用來告訴用戶 MySQL 會怎樣執(zhí)行這條 SQL,以什么樣的順序,如果是多表的話是怎樣 Join的。

輸出字段官網(wǎng)文檔截圖如下:

Explain是怎么執(zhí)行MySQL語句的

上面返回看似不少,不過我們重點關(guān)注 type、key、rows 這三個。

我們常見應(yīng)用的場景都是讀多寫少,而且對于 SQL 的執(zhí)行的效率評估,一般也是說從已經(jīng)存儲的十成、百萬甚至千萬條數(shù)據(jù)中查詢需要數(shù)據(jù)的效率。

后面以 SELECT 為例,來看看 explain 能帶給我們什么幫忙和建議。

假設(shè)有如下表定義及數(shù)據(jù):

CREATE TABLE `t3` (   `id` int NOT NULL,   `a` int DEFAULT NULL,   `b` int DEFAULT NULL,   PRIMARY KEY (`id`),   KEY `a` (`a`) ) ENGINE=InnoDB;  delimiter ;; create procedure idata() begin    declare i int;   set i=1;   while(i<=100000) do     insert into t3 values(i,i,i);      set i=i+1;     end while;   end;; delimiter ; call idata();

執(zhí)行完上述SQL,我們來試想一下,在當(dāng)前十萬行數(shù)據(jù)的表中如果執(zhí)行一條查詢SQL,那在少量數(shù)據(jù)中查找一定比全表查找要快很好。

比如我們最熟悉的通過主鍵查詢

select a from t3 where id=100;

你會發(fā)現(xiàn),explain 中 type 是 const, key 是 PRIMARY

Explain是怎么執(zhí)行MySQL語句的

再比如執(zhí)行

select  * from t3 where b=100;

這個時候, explain 告訴我們,查詢類型是ALL,全表掃描:

Explain是怎么執(zhí)行MySQL語句的

如果我們是想要把這個表里全部數(shù)據(jù)顯示也就罷了,目前只查一條數(shù)據(jù)卻執(zhí)行全表掃描,explain 告訴我們掃描行可能會到9萬多行,效率可想而知。

如果我們把SQL 改成這樣:

select * from t3 where a=100;

此時 explain 變成了這樣:

Explain是怎么執(zhí)行MySQL語句的

你會發(fā)現(xiàn),type 變成了 ref, key 變成了a, rows 是1, 區(qū)別只在于 a 列上建立了索引,此時掃描行數(shù)變成了一行,差別太明顯了。

如果我們要查找一個范圍內(nèi)的數(shù)據(jù),通過主鍵或者包含索引的列進(jìn)行查詢時,

Explain是怎么執(zhí)行MySQL語句的

掃描的還是有限行,此時type是range,但如果還是通過 b 做為條件進(jìn)行過濾,那還是全表掃描:

Explain是怎么執(zhí)行MySQL語句的

另外,為什么一般的SQL優(yōu)化建議里都會說別用 select * ,指定具體用到的列呢?

肯定是用到什么列的數(shù)據(jù)查什么數(shù)據(jù)更節(jié)省內(nèi)存,傳輸,不要等到查出結(jié)果再在內(nèi)存里進(jìn)行過濾,此外更重要的一點是,每個創(chuàng)建的索引,都有自己的索引樹,能夠在索引樹上完成查詢操作,就不需要再回表去查詢,效率當(dāng)然會更高。

比如,我們把查詢換成了

select a,id from t3 where a < 100;

此時,explain 會在Extra里告訴咱們,查詢的時候沒有回表,用到了index

Explain是怎么執(zhí)行MySQL語句的

如果把查詢列改成星,這個時候,就需要回表了,

Explain是怎么執(zhí)行MySQL語句的

咱們前面說重點關(guān)注 type, key, rows,可以再看下 Extra, type 里查詢效率從優(yōu)到差,有

const

表中只有一行匹配,查詢一次即可滿足。常用來匹配主鍵或者唯一索引。

eq_ref

唯一索引

ref

非唯一索引

range

通過一個索引去查詢,只掃描指定范圍內(nèi)的行。一般是在檢索列中包含 =, <>, >, >=, <, <=, IS  NULL, <=>, BETWEEN, LIKE, or IN()

index

類似于全表掃描,區(qū)別在于只掃描索引樹

all

全表掃描,效率最低的。

在 MySQL 8.0.18 開始,還加入了一個 explain  analyze,可以查看具體預(yù)計SQL執(zhí)行耗時,比如我們通過它來查看上面的幾個命令,會有如下輸出,你會更直觀的感覺到加了索引帶來的效率提升。

Explain是怎么執(zhí)行MySQL語句的

Explain是怎么執(zhí)行MySQL語句的

到此,關(guān)于“Explain是怎么執(zhí)行MySQL語句的”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

名稱欄目:Explain是怎么執(zhí)行MySQL語句的
鏈接URL:http://www.rwnh.cn/article14/ghcsge.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、軟件開發(fā)、電子商務(wù)、網(wǎng)站排名、網(wǎng)站收錄商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
六盘水市| 曲麻莱县| 庆阳市| 乡城县| 青岛市| 贵德县| 巍山| 思茅市| 牙克石市| 双牌县| 通化市| 宜章县| 纳雍县| 临西县| 普宁市| 湾仔区| 兰坪| 娱乐| 江津市| 镇原县| 广水市| 依兰县| 沅陵县| 信阳市| 田阳县| 绥芬河市| 定兴县| 华阴市| 彩票| 巴东县| 柳林县| 漠河县| 双流县| 澄迈县| 万载县| 高淳县| 承德县| 抚远县| 锦州市| 芦山县| 德阳市|