校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 詳解mysql中explain的type

詳解mysql中explain的type

熱門標簽:400電話鄭州申請 沃克斯電梯外呼線路圖 天智外呼系統(tǒng) 常州電銷外呼系統(tǒng)一般多少錢 地圖標注被騙三百怎么辦 云南語音外呼系統(tǒng)平臺 北京人工外呼系統(tǒng)價錢 福州呼叫中心外呼系統(tǒng)哪家好 房產(chǎn)智能外呼系統(tǒng)品牌

導語:

很多情況下,有很多人用各種select語句查詢到了他們想要的數(shù)據(jù)后,往往便以為工作圓滿結束了。
這些事情往往發(fā)生在一些學生亦或剛入職場但之前又沒有很好數(shù)據(jù)庫基礎的小白身上,但所謂聞道有先后,只要我們小白好好學習,天天向上,還是很靠譜的。

當一個sql查詢語句被寫出來之后,其實你的工作只完成了一小半,接下來更重要的工作是評估你自己寫的sql的質量與效率。mysql為我們提供了很有用的輔助武器explain,它向我們展示了mysql接收到一條sql語句的執(zhí)行計劃。根據(jù)explain返回的結果我們便可以知道我們的sql寫的怎么樣,是否會造成查詢瓶頸,同時根據(jù)結果不斷的修改調整查詢語句,從而完成sql優(yōu)化的過程。

雖然 explain返回的結果項很多,這里我們只關注三種,分別是type,key,rows。其中key表明的是這次查找中所用到的索引,rows是指這次查找數(shù)據(jù)所掃描的行數(shù)(這里可以先這樣理解,但實際上是內循環(huán)的次數(shù))。而type則是本文要詳細記錄的連接類型,前兩項重要而且簡單,無需多說。

type -- 連接類型

type意味著類型,這里的type官方全稱是“join type”,意思是“連接類型”,這樣很容易給人一種錯覺覺得必須需要倆個表以上才有連接類型。事實上這里的連接類型并非字面那樣的狹隘,它更確切的說是一種數(shù)據(jù)庫引擎查找表的一種方式,在《高性能mysql》一書中作者更是覺得稱呼它為訪問類型更貼切一些。

mysql5.7中type的類型達到了14種之多,這里只記錄和理解最重要且經(jīng)常遇見的六種類型,它們分別是all,index,range,ref,eq_ref,const。從左到右,它們的效率依次是增強的。撇開sql的具體應用環(huán)境以及其他因素,你應當盡量優(yōu)化你的sql語句,使它的type盡量靠右,但實際運用中還是要綜合考慮各個方面的。

接下來,為了演示和重現(xiàn)這幾種連接類型,我新建了一個數(shù)據(jù)測試表,以方面更好的理解這五種類型。

| employee | CREATE TABLE `employee` (
 `rec_id` int(11) NOT NULL AUTO_INCREMENT,
 `no` varchar(10) NOT NULL,
 `name` varchar(20) NOT NULL,
 `position` varchar(20) NOT NULL,
 `age` varchar(2) NOT NULL,
 PRIMARY KEY (`rec_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 |

all

這便是所謂的“全表掃描”,如果是展示一個數(shù)據(jù)表中的全部數(shù)據(jù)項,倒是覺得也沒什么,如果是在一個查找數(shù)據(jù)項的sql中出現(xiàn)了all類型,那通常意味著你的sql語句處于一種最原生的狀態(tài),有很大的優(yōu)化空間。
為什么這么說呢?因為all是一種非常暴力和原始的查找方法,非常的耗時而且低效。用all去查找數(shù)據(jù)就好比這樣的一個情形:S學校有倆萬人,我告訴你你給我找到小明,然后你怎么做呢!你當然是把全校倆萬人挨個找一遍,即使你很幸運第一個人便找到了小明,但是你仍然不能停下,因為你無法確認是否有另外一個小明存在,直到你把倆萬人找完為止。所以,基本所有情況,我們都要避免這樣類型的查找,除非你不得不這樣做。
以employee表為例,下面一種情形便是all類型的查找:

mysql> explain select * from employee where `no` = '20150001';
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table  | type | possible_keys | key | key_len | ref | rows | Extra    |
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE   | employee | ALL | NULL     | NULL | NULL  | NULL |  5 | Using where |
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+

這是因為no列既不是主鍵也不是索引,因此只能采用全表掃描來查找目標no。

index

這種連接類型只是另外一種形式的全表掃描,只不過它的掃描順序是按照索引的順序。這種掃描根據(jù)索引然后回表取數(shù)據(jù),和all相比,他們都是取得了全表的數(shù)據(jù),而且index要先讀索引而且要回表隨機取數(shù)據(jù),因此index不可能會比all快(取同一個表數(shù)據(jù)),但為什么官方的手冊將它的效率說的比all好,唯一可能的原因在于,按照索引掃描全表的數(shù)據(jù)是有序的。這樣一來,結果不同,也就沒法比效率的問題了。
如果一定要比效率,只需要獲取這個表的數(shù)據(jù)并且排序便可以看出來誰比誰效率高了:

mysql> explain select * from employee order by `no` ;
+----+-------------+----------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table  | type | possible_keys | key | key_len | ref | rows | Extra     |
+----+-------------+----------+------+---------------+------+---------+------+------+----------------+
| 1 | SIMPLE   | employee | ALL | NULL     | NULL | NULL  | NULL |  5 | Using filesort |
+----+-------------+----------+------+---------------+------+---------+------+------+----------------+
mysql> explain select * from employee order by rec_id ;
+----+-------------+----------+-------+---------------+---------+---------+------+------+-------+
| id | select_type | table  | type | possible_keys | key   | key_len | ref | rows | Extra |
+----+-------------+----------+-------+---------------+---------+---------+------+------+-------+
| 1 | SIMPLE   | employee | index | NULL     | PRIMARY | 4    | NULL |  5 | NULL |
+----+-------------+----------+-------+---------------+---------+---------+------+------+-------+

上面可以看出,根據(jù)no列排序的連接類型是all型的,但是注意extra列是用到了排序(Using filesort),而根據(jù)rec_id列排序的連接類型是index,而且得到的結果自然是有序的,不許額外的排序。可能正是因為這個緣故,index的效率比all高,但注意這需要相同的條件才成立(既需要排序)。

如果連接類型為type,而且extra列中的值為‘Using index',那么稱這種情況為 索引覆蓋;
索引覆蓋意味著什么呢?想象這樣一種場景,如果說一本新華字典是一張表,當然前面的索引部分(假設按照部首的索引)是這張表的索引,那么索引覆蓋就相當于根據(jù)部首索引獲取第一個字到最后一個字(新華字典的所有字)。我們獲得了字典中所有的字,然而我們并沒有查一次表,因為我們想要的都早索引中,即索引覆蓋。

mysql> explain select rec_id from employee ;
+----+-------------+----------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table  | type | possible_keys | key   | key_len | ref | rows | Extra    |
+----+-------------+----------+-------+---------------+---------+---------+------+------+-------------+
| 1 | SIMPLE   | employee | index | NULL     | PRIMARY | 4    | NULL |  5 | Using index |
+----+-------------+----------+-------+---------------+---------+---------+------+------+-------------+

上例獲取的rec_id剛好為索引列,因此無需回表取數(shù)據(jù)。

range

range指的是有范圍的索引掃描,相對于index的全索引掃描,它有范圍限制,因此要優(yōu)于index。關于range比較容易理解,需要記住的是出現(xiàn)了range,則一定是基于索引的。同時除了顯而易見的between,and以及'>',''外,in和or也是索引范圍掃描。

ref

出現(xiàn)該連接類型的條件是: 查找條件列使用了索引而且不為主鍵和unique。其實,意思就是雖然使用了索引,但該索引列的值并不唯一,有重復。這樣即使使用索引快速查找到了第一條數(shù)據(jù),仍然不能停止,要進行目標值附近的小范圍掃描。但它的好處是它并不需要掃全表,因為索引是有序的,即便有重復值,也是在一個非常小的范圍內掃描。下面為了演示這種情形,給employee表中的name列添加一個普通的key(值允許重復)

 alter table employee add key I_EMPLOYEE_NAME(`name`); 

接下來,在employee表中根據(jù)name查找數(shù)據(jù)的時候,mysql優(yōu)化器便選擇了ref的連接類型。

mysql> explain select * from employee where `name` = '張三';
+----+-------------+----------+------+----------------+----------------+---------+-------+------+-----------------------+
| id | select_type | table  | type | possible_keys | key      | key_len | ref  | rows | Extra         |
+----+-------------+----------+------+----------------+----------------+---------+-------+------+-----------------------+
| 1 | SIMPLE   | employee | ref | I_EMPLOYEE_NAM | I_EMPLOYEE_NAM | 62   | const |  1 | Using index condition |
+----+-------------+----------+------+----------------+----------------+---------+-------+------+-----------------------+

ref_eq

ref_eq 與 ref相比牛的地方是,它知道這種類型的查找結果集只有一個?什么情況下結果集只有一個呢!那便是使用了主鍵或者唯一性索引進行查找的情況,比如根據(jù)學號查找某一學校的一名同學,在沒有查找前我們就知道結果一定只有一個,所以當我們首次查找到這個學號,便立即停止了查詢。這種連接類型每次都進行著精確查詢,無需過多的掃描,因此查找效率更高,當然列的唯一性是需要根據(jù)實際情況決定的。
在單個表中,曾嘗試了很多方法想出現(xiàn)ref_eq的連接類型,然而很多時候出現(xiàn)的都是const,因此不得不隨手連接了一張表得到了想要的連接類型,該表的建表代買為。(博主比較懶,連接了兩個沒有關系的表,o(╯□╰)o)

CREATE TABLE `score` (
 `rec_id` INT(11) NOT NULL AUTO_INCREMENT,
 `stu_id` INT(11) NOT NULL,
 `mark` INT(11) NOT NULL DEFAULT '0',
 PRIMARY KEY (`rec_id`),
 UNIQUE KEY `UK_SCORE_STU_ID` (`stu_id`)
) ENGINE=INNODB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8

employee表中有五條數(shù)據(jù),score表中有對應的五條數(shù)據(jù),其中employee的rec_id 和score的stu_id 是一一對應的。

mysql> explain select ep.name,sc.mark from employee ep,score sc where ep.rec_id = sc.stu_id;
+----+-------------+-------+--------+-----------------+---------+---------+-----------------+------+-------+
| id | select_type | table | type  | possible_keys  | key   | key_len | ref       | rows | Extra |
+----+-------------+-------+--------+-----------------+---------+---------+-----------------+------+-------+
| 1 | SIMPLE   | sc  | ALL  | UK_SCORE_STU_ID | NULL  | NULL  | NULL      |  5 | NULL |
| 1 | SIMPLE   | ep  | eq_ref | PRIMARY     | PRIMARY | 4    | my_db.sc.stu_id |  1 | NULL |
+----+-------------+-------+--------+-----------------+---------+---------+-----------------+------+-------+

上面就可以看到score表是全表掃描的類型,rows=5代表外層表循環(huán)了五次(因為有五條數(shù)據(jù)),但是employee表的rows怎么是1,怎么可能?剛開始也是很疑惑,這與mysql的查詢原理息息相關,rows實際反映的是查詢的內循環(huán)數(shù),針對外層的每一條數(shù)據(jù)匹配,employee的確一槍就可以命中,因此rows為1。

const

通常情況下,如果將一個主鍵放置到where后面作為條件查詢,mysql優(yōu)化器就能把這次查詢優(yōu)化轉化為一個常量。至于如何轉化以及何時轉化,這個取決于優(yōu)化器。

總結

explain 就像一面鏡子,有事沒事寫完sql記得explain一下。同時,在寫文章也發(fā)現(xiàn),有很多東西和細節(jié),想要明白清楚,也是沒有那么簡單的,需要對操作系統(tǒng)以及數(shù)據(jù)庫的底層查詢和運行原理要有一個清楚的理解。同時type的幾種類型幾乎都是基于索引之上的,因此需要對索引有個深入的了解,而且explain的結果可以指導我們什么時候加索引,什么時候不加索引,從而讓我們更好的使用索引。

以上就是詳解mysql中explain的type的詳細內容,更多關于mysql中explain的type的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • MySQL查詢語句過程和EXPLAIN語句基本概念及其優(yōu)化
  • mysql開啟慢查詢(EXPLAIN SQL語句使用介紹)
  • mysql explain的用法(使用explain優(yōu)化查詢語句)
  • Mysql調優(yōu)Explain工具詳解及實戰(zhàn)演練(推薦)
  • Mysql explain用法與結果深入分析
  • MySQL如何基于Explain關鍵字優(yōu)化索引功能
  • Mysql深入探索之Explain執(zhí)行計劃詳析
  • MySQL索引優(yōu)化Explain詳解
  • MYSQL 性能分析器 EXPLAIN 用法實例分析
  • MySQL中通過EXPLAIN如何分析SQL的執(zhí)行計劃詳解
  • MySQL EXPLAIN語句的使用示例

標簽:沈陽 鹽城 移動 拉薩 珠海 徐州 黔東 沈陽

巨人網(wǎng)絡通訊聲明:本文標題《詳解mysql中explain的type》,本文關鍵詞  詳解,mysql,中,explain,的,type,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳解mysql中explain的type》相關的同類信息!
  • 本頁收集關于詳解mysql中explain的type的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    黄网站免费久久| 国产清纯美女被跳蛋高潮一区二区久久w| 国产一区999| 韩国三级在线一区| 免费人成精品欧美精品| 丝袜美腿亚洲一区二区图片| 国产精品久久久久一区| 国产精品伦理在线| 亚洲天堂免费看| 亚洲欧美日韩系列| 亚洲成av人片观看| 国产一区二区三区在线观看免费视频 | 国内外成人在线视频| 青青草原综合久久大伊人精品优势 | 久久久久99精品国产片| 中文字幕一区二区三区在线播放 | 亚洲精品乱码久久久久久日本蜜臀| 国产精品久久毛片a| 欧美激情综合五月色丁香| 亚洲精品免费视频| 国内精品久久久久影院一蜜桃| 国产ts人妖一区二区| 欧美精品一卡二卡| 国产精品乱人伦中文| 一区二区三区影院| 久久国产成人午夜av影院| 国产寡妇亲子伦一区二区| 色婷婷av一区二区三区gif| 制服丝袜激情欧洲亚洲| 国产欧美日本一区视频| 秋霞午夜av一区二区三区| 国产91在线观看丝袜| 欧美性欧美巨大黑白大战| 日韩一级成人av| 亚洲影院理伦片| 高清久久久久久| 精品国偷自产国产一区| 亚洲婷婷国产精品电影人久久| 丝袜国产日韩另类美女| 成人午夜av影视| 久久久五月婷婷| 石原莉奈在线亚洲三区| 欧美日韩一区视频| 亚洲综合一区二区三区| 欧美日韩在线一区二区| 亚洲欧美乱综合| 日本道免费精品一区二区三区| 国产精品五月天| 不卡在线视频中文字幕| 国产亚洲一区二区在线观看| 国内精品视频一区二区三区八戒 | 亚洲欧洲www| 高清国产一区二区三区| 久久久久久电影| 成人激情综合网站| 亚洲女同女同女同女同女同69| www.欧美日韩国产在线| 亚洲福利视频三区| 337p粉嫩大胆色噜噜噜噜亚洲 | 九九九精品视频| 26uuu国产一区二区三区| 成人免费看黄yyy456| 亚洲欧美日韩一区二区三区在线观看| 豆国产96在线|亚洲| 亚洲丰满少妇videoshd| 精品免费视频一区二区| 91免费国产视频网站| 亚洲成人激情社区| 精品国产乱码91久久久久久网站| 国产不卡一区视频| 日韩不卡手机在线v区| 中文字幕一区二区三区在线不卡| 不卡在线视频中文字幕| 免费成人你懂的| 亚洲综合无码一区二区| 日本一区二区免费在线观看视频 | 亚洲国产精品成人久久综合一区 | 久久中文字幕电影| 在线亚洲一区二区| 国产精品综合网| 五月天丁香久久| 亚洲欧美福利一区二区| 久久免费视频色| 日韩美女一区二区三区四区| 欧美日韩免费一区二区三区视频| 成人黄色av网站在线| 国产v综合v亚洲欧| 国产成人日日夜夜| 蜜臀av亚洲一区中文字幕| 五月天欧美精品| 天天综合色天天| 国产精品久久久久久久久免费丝袜 | 亚洲自拍欧美精品| 亚洲免费资源在线播放| 亚洲人xxxx| 日韩影院免费视频| 蜜臀久久久99精品久久久久久| 亚洲一区二区综合| 亚洲一区二区三区爽爽爽爽爽| 青青草原综合久久大伊人精品优势| 美女一区二区三区在线观看| 成人av动漫在线| 在线不卡a资源高清| 国产日韩成人精品| 日韩影视精彩在线| 99视频一区二区| 欧美成人a∨高清免费观看| 亚洲精品成人少妇| 激情深爱一区二区| 欧美精品第一页| 国产精品久久久久久久久晋中 | 国产亚洲精品bt天堂精选| 亚洲美女精品一区| 99re亚洲国产精品| 久久先锋影音av| 亚洲欧美日韩综合aⅴ视频| 久久精品国产一区二区三区免费看| 白白色 亚洲乱淫| 2020国产精品自拍| 国产精品 日产精品 欧美精品| 日韩视频永久免费| 日本伊人精品一区二区三区观看方式| 欧美日韩综合不卡| 视频一区在线播放| 91精品国产欧美日韩| 亚洲一区二区在线播放相泽| 91麻豆精东视频| 亚洲综合在线免费观看| 91久久一区二区| 亚洲国产日韩在线一区模特| 欧美亚洲综合久久| 亚洲一区二区三区不卡国产欧美| 欧美午夜精品一区二区三区| 亚洲成人福利片| 国产亚洲va综合人人澡精品| 国产精品一区三区| 亚洲综合免费观看高清完整版在线| 欧美人体做爰大胆视频| 日韩国产欧美三级| 久久精品亚洲麻豆av一区二区| 成人国产精品免费观看视频| 亚洲成人777| 国产网站一区二区三区| 欧美日韩国产首页| 成人黄色小视频在线观看| 亚洲18色成人| 国产精品激情偷乱一区二区∴| 在线视频国内自拍亚洲视频| 久久精品国产亚洲a| 亚洲精品一二三| 国产无遮挡一区二区三区毛片日本| 色综合天天综合网天天看片| 日本欧美加勒比视频| 国产精品久久久久久久久搜平片| 欧美午夜宅男影院| 国产成人精品三级麻豆| 日本视频一区二区| 一区二区三区四区在线免费观看| 欧美精品一区二区在线观看| 欧美日韩视频在线观看一区二区三区 | 亚洲人一二三区| 国产欧美一区二区三区网站 | 亚洲精品国产品国语在线app| 欧美成人a∨高清免费观看| 欧美日韩国产a| 欧美日韩亚州综合| 欧美无砖砖区免费| 在线精品视频免费播放| 91丨九色丨黑人外教| 91在线视频18| 99久久国产综合精品女不卡| 不卡一区二区中文字幕| 99re这里只有精品首页| 91香蕉视频在线| 在线观看不卡视频| 欧美一级片在线| 中文成人综合网| 亚洲女性喷水在线观看一区| 成人欧美一区二区三区在线播放| 中文字幕亚洲综合久久菠萝蜜| 亚洲色图在线看| 日韩精品成人一区二区三区| 久久精品99国产国产精| 粉嫩嫩av羞羞动漫久久久| 欧美亚洲国产bt| 精品日韩在线观看| 国产精品乱码人人做人人爱 | 国产精品素人视频| 亚洲一二三级电影| 免费在线观看一区| 91豆麻精品91久久久久久| 日韩视频在线永久播放| 亚洲欧美日韩久久精品| 国产一区二区精品久久| 成年人国产精品| 欧美日韩免费一区二区三区| 亚洲精品在线免费观看视频| 一区二区三区四区视频精品免费 | 91影视在线播放| 欧美mv日韩mv国产网站|