日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

詳解mysql中explain的type

瀏覽:66日期:2023-10-09 07:34:34

導(dǎo)語:

很多情況下,有很多人用各種select語句查詢到了他們想要的數(shù)據(jù)后,往往便以為工作圓滿結(jié)束了。這些事情往往發(fā)生在一些學(xué)生亦或剛?cè)肼殘龅坝譀]有很好數(shù)據(jù)庫基礎(chǔ)的小白身上,但所謂聞道有先后,只要我們小白好好學(xué)習(xí),天天向上,還是很靠譜的。

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

詳解mysql中explain的type

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

type -- 連接類型

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

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

接下來,為了演示和重現(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學(xué)校有倆萬人,我告訴你你給我找到小明,然后你怎么做呢!你當(dāng)然是把全校倆萬人挨個找一遍,即使你很幸運(yùn)第一個人便找到了小明,但是你仍然不能停下,因為你無法確認(rèn)是否有另外一個小明存在,直到你把倆萬人找完為止。所以,基本所有情況,我們都要避免這樣類型的查找,除非你不得不這樣做。以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列既不是主鍵也不是索引,因此只能采用全表掃描來查找目標(biāo)no。

index

這種連接類型只是另外一種形式的全表掃描,只不過它的掃描順序是按照索引的順序。這種掃描根據(jù)索引然后回表取數(shù)據(jù),和all相比,他們都是取得了全表的數(shù)據(jù),而且index要先讀索引而且要回表隨機(jī)取數(shù)據(jù),因此index不可能會比all快(取同一個表數(shù)據(jù)),但為什么官方的手冊將它的效率說的比all好,唯一可能的原因在于,按照索引掃描全表的數(shù)據(jù)是有序的。這樣一來,結(jié)果不同,也就沒法比效率的問題了。如果一定要比效率,只需要獲取這個表的數(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,而且得到的結(jié)果自然是有序的,不許額外的排序。可能正是因為這個緣故,index的效率比all高,但注意這需要相同的條件才成立(既需要排序)。

如果連接類型為type,而且extra列中的值為‘Using index’,那么稱這種情況為 索引覆蓋;索引覆蓋意味著什么呢?想象這樣一種場景,如果說一本新華字典是一張表,當(dāng)然前面的索引部分(假設(shè)按照部首的索引)是這張表的索引,那么索引覆蓋就相當(dāng)于根據(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。關(guān)于range比較容易理解,需要記住的是出現(xiàn)了range,則一定是基于索引的。同時除了顯而易見的between,and以及’>’,’<’外,in和or也是索引范圍掃描。

ref

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

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相比牛的地方是,它知道這種類型的查找結(jié)果集只有一個?什么情況下結(jié)果集只有一個呢!那便是使用了主鍵或者唯一性索引進(jìn)行查找的情況,比如根據(jù)學(xué)號查找某一學(xué)校的一名同學(xué),在沒有查找前我們就知道結(jié)果一定只有一個,所以當(dāng)我們首次查找到這個學(xué)號,便立即停止了查詢。這種連接類型每次都進(jìn)行著精確查詢,無需過多的掃描,因此查找效率更高,當(dāng)然列的唯一性是需要根據(jù)實(shí)際情況決定的。在單個表中,曾嘗試了很多方法想出現(xiàn)ref_eq的連接類型,然而很多時候出現(xiàn)的都是const,因此不得不隨手連接了一張表得到了想要的連接類型,該表的建表代買為。(博主比較懶,連接了兩個沒有關(guān)系的表,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表中有對應(yīng)的五條數(shù)據(jù),其中employee的rec_id 和score的stu_id 是一一對應(yīng)的。

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的查詢原理息息相關(guān),rows實(shí)際反映的是查詢的內(nèi)循環(huán)數(shù),針對外層的每一條數(shù)據(jù)匹配,employee的確一槍就可以命中,因此rows為1。

const

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

總結(jié)

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

以上就是詳解mysql中explain的type的詳細(xì)內(nèi)容,更多關(guān)于mysql中explain的type的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: MySQL 數(shù)據(jù)庫
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲精品激情| 国产成人免费视频网站视频社区| 精品视频自拍| 亚洲精品进入| 日韩专区在线视频| 久久香蕉精品| 老牛影视一区二区三区| 免费视频最近日韩| 亚洲欧美专区| 欧美精品福利| 国产亚洲精品美女久久| 国产午夜精品一区在线观看| 国产日韩欧美高清免费| 国产精品一区毛片| 另类欧美日韩国产在线| 国产一区丝袜| 日本久久成人网| 久久国产日本精品| 米奇777超碰欧美日韩亚洲| 欧美精品羞羞答答| 亚洲婷婷丁香| 国产精品亲子伦av一区二区三区| 久久精品毛片| 欧美日韩精品一区二区视频| 在线综合视频| 日韩精品一区第一页| 91免费精品国偷自产在线在线| 国产精品第十页| 国产盗摄——sm在线视频| 久久高清精品| 免费在线观看日韩欧美| 国产乱码精品一区二区三区亚洲人| 蜜桃久久久久| 成人看片网站| 国产精品免费看| 欧美日韩夜夜| 日韩精品水蜜桃| 蜜臀a∨国产成人精品| 国产精品一线| 久久五月天小说| 久久高清国产| 国产私拍福利精品视频二区| 国产精选在线| 亚洲一区二区三区四区电影| 久久av网址| 欧美日韩在线网站| 日韩精品免费一区二区夜夜嗨 | 国产欧美日韩一区二区三区在线| 精品久久97| 国产色综合网| 美腿丝袜在线亚洲一区| 亚洲二区免费| 青草综合视频| 欧美性感美女一区二区| 日韩成人午夜精品| 欧美日韩精品免费观看视完整| 免费在线观看成人| 国产福利电影在线播放| 亚洲欧美网站| 精品一区二区三区中文字幕| 在线亚洲一区| 日产精品一区二区| 亚洲综合小说| 蜜臀久久精品| 欧美日韩一区二区国产| 香蕉人人精品| 国产精品成人国产| 伊人久久成人| 精品视频一区二区三区四区五区| 黄色国产精品| 精品三区视频| 亚洲欧美视频| 欧美日韩精品免费观看视欧美高清免费大片| 亚洲欧美日韩国产综合精品二区| 久久精品免费看| 亚洲婷婷丁香| 91精品蜜臀一区二区三区在线| 清纯唯美亚洲综合一区| 免费黄色成人| 成人亚洲欧美| 国产麻豆精品| 亚洲网址在线观看| 九九在线精品| 高清一区二区三区| 人人爱人人干婷婷丁香亚洲| 欧美午夜不卡影院在线观看完整版免费| 国产精品www.| 亚洲狼人精品一区二区三区| 日韩欧美一区二区三区免费看| 婷婷亚洲精品| 欧美精选一区二区三区| 国产成人精品三级高清久久91| 日韩一区二区三免费高清在线观看| 国产精品99一区二区| 久久69成人| 久久国产日韩欧美精品| 日本欧美在线看| 黑丝一区二区三区| 伊人精品一区| 久久蜜桃资源一区二区老牛| 久久精品国产久精国产| 欧美日韩亚洲一区在线观看| 日av在线不卡| 激情久久久久久久| 鲁鲁在线中文| 精品一区二区三区在线观看视频| 91大神在线观看线路一区| 视频一区视频二区在线观看| 激情欧美一区二区三区| 亚洲天堂资源| 国产精品伦理久久久久久| 国产精品九九| 国产精品亚洲产品| 欧美啪啪一区| 日本视频一区二区| 日韩精品三区四区| 日韩高清电影免费| 日本欧美一区| 少妇精品久久久一区二区三区| 亚洲自拍另类| 久久高清国产| 男女性色大片免费观看一区二区| 亚洲一区二区三区高清| 伊人久久婷婷| 在线亚洲观看| 先锋亚洲精品| 日av在线不卡| 日韩一区二区三区精品| 日韩av午夜在线观看| 日本va欧美va瓶| 欧美一区影院| 国产精品亚洲人成在99www| 国产欧美三级| 国产精品成人3p一区二区三区| 久久av导航| 精品一区二区三区在线观看视频| 福利视频一区| 亚洲人成在线网站| 国产一区亚洲| 99pao成人国产永久免费视频| 五月天久久777| 久久大逼视频| 欧美日韩视频免费看| 国产精品一区二区精品| 精品视频自拍| 99精品电影| 国产精品女主播一区二区三区| 免费精品视频最新在线| 最新国产精品| 国产日韩亚洲| 91亚洲人成网污www| 亚洲a一区二区三区| 亚洲一区久久| 日本午夜精品视频在线观看| 国产精品va视频| 激情国产在线| 最新亚洲激情| 91成人福利| zzzwww在线看片免费| 国产国产精品| 亚洲开心激情| 韩日一区二区| 欧美福利在线| 综合色一区二区| 免费在线日韩av| 久久国产精品成人免费观看的软件| 亚洲欧美日本视频在线观看| 国产精一区二区| 成人福利视频| 蜜桃久久久久久久| 欧美激情福利| 免费精品国产的网站免费观看| 亚洲免费成人av在线| 久久精品国产久精国产爱| 亚洲午夜精品久久久久久app| 五月亚洲婷婷| av在线资源| 免费在线看一区| 国产精品片aa在线观看| 久久国产精品成人免费观看的软件| 亚洲精品麻豆| 成人av三级| 日韩一区二区三区精品| 日韩深夜视频| 亚洲精品一级| 成人亚洲欧美| 日韩精品亚洲专区在线观看| 快播电影网址老女人久久| 午夜在线一区二区| 精品美女在线视频| 日韩中文字幕不卡| 国产乱码午夜在线视频| 日韩亚洲精品在线观看| 91一区二区三区四区| 只有精品亚洲| 日韩成人亚洲| 欧美中文高清| 欧美不卡高清| 久久99国产精品视频| 免费在线观看视频一区|