电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

詳解mysql中explain的type

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

導語:

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

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

詳解mysql中explain的type

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

type -- 連接類型

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

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

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

| 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

這便是所謂的“全表掃描”,如果是展示一個數據表中的全部數據項,倒是覺得也沒什么,如果是在一個查找數據項的sql中出現了all類型,那通常意味著你的sql語句處于一種最原生的狀態,有很大的優化空間。為什么這么說呢?因為all是一種非常暴力和原始的查找方法,非常的耗時而且低效。用all去查找數據就好比這樣的一個情形: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

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

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 |+----+-------------+----------+-------+---------------+---------+---------+------+------+-------+

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

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

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剛好為索引列,因此無需回表取數據。

range

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

ref

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

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

接下來,在employee表中根據name查找數據的時候,mysql優化器便選擇了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相比牛的地方是,它知道這種類型的查找結果集只有一個?什么情況下結果集只有一個呢!那便是使用了主鍵或者唯一性索引進行查找的情況,比如根據學號查找某一學校的一名同學,在沒有查找前我們就知道結果一定只有一個,所以當我們首次查找到這個學號,便立即停止了查詢。這種連接類型每次都進行著精確查詢,無需過多的掃描,因此查找效率更高,當然列的唯一性是需要根據實際情況決定的。在單個表中,曾嘗試了很多方法想出現ref_eq的連接類型,然而很多時候出現的都是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表中有五條數據,score表中有對應的五條數據,其中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代表外層表循環了五次(因為有五條數據),但是employee表的rows怎么是1,怎么可能?剛開始也是很疑惑,這與mysql的查詢原理息息相關,rows實際反映的是查詢的內循環數,針對外層的每一條數據匹配,employee的確一槍就可以命中,因此rows為1。

const

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

總結

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

以上就是詳解mysql中explain的type的詳細內容,更多關于mysql中explain的type的資料請關注好吧啦網其它相關文章!

標簽: MySQL 數據庫
相關文章:
主站蜘蛛池模板: 亿立分板机_曲线_锯片式_走刀_在线式全自动_铣刀_在线V槽分板机-杭州亿协智能装备有限公司 | 浙江皓格药业有限公司| 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库-首页-东莞市傲马网络科技有限公司 | 济南展厅设计施工_数字化展厅策划设计施工公司_山东锐尚文化传播有限公司 | 丝印油墨_水性油墨_环保油墨油漆厂家_37国际化工 | 减速机三参数组合探头|TSM803|壁挂式氧化锆分析仪探头-安徽鹏宸电气有限公司 | 间苯二酚,间苯二酚厂家-淄博双和化工 | 亿立分板机_曲线_锯片式_走刀_在线式全自动_铣刀_在线V槽分板机-杭州亿协智能装备有限公司 | 播音主持培训-中影人教育播音主持学苑「官网」-中国艺考界的贵族学校 | 顺景erp系统_erp软件_erp软件系统_企业erp管理系统-广东顺景软件科技有限公司 | 打包箱房_集成房屋-山东佳一集成房屋有限公司 | 不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰]-不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰] | 企业管理培训,企业培训公开课,企业内训课程,企业培训师 - 名课堂企业管理培训网 | 石家庄网站建设|石家庄网站制作|石家庄小程序开发|石家庄微信开发|网站建设公司|网站制作公司|微信小程序开发|手机APP开发|软件开发 | 色谱柱-淋洗液罐-巴罗克试剂槽-巴氏吸管-5ml样品瓶-SBS液氮冻存管-上海希言科学仪器有限公司 | 印刷人才网 印刷、包装、造纸,中国80%的印刷企业人才招聘选印刷人才网! | 耐破强度测试仪-纸箱破裂强度试验机-济南三泉中石单品站 | 温州中研白癜风专科_温州治疗白癜风_温州治疗白癜风医院哪家好_温州哪里治疗白癜风 | 安徽控制器-合肥船用空调控制器-合肥家电控制器-合肥迅驰电子厂 安徽净化板_合肥岩棉板厂家_玻镁板厂家_安徽科艺美洁净科技有限公司 | 生物除臭剂-除味剂-植物-污水除臭剂厂家-携葵环保有限公司 | 「银杏树」银杏树行情价格_银杏树种植_山东程锦园林 | 渣油泵,KCB齿轮泵,不锈钢齿轮泵,重油泵,煤焦油泵,泊头市泰邦泵阀制造有限公司 | 水篦子|雨篦子|镀锌格栅雨水篦子|不锈钢排水篦子|地下车库水箅子—安平县云航丝网制品厂 | 护腰带生产厂家_磁石_医用_热压护腰_登山护膝_背姿矫正带_保健护具_医疗护具-衡水港盛 | 卡诺亚轻高定官网_卧室系统_整家定制_定制家居_高端定制_全屋定制加盟_定制家具加盟_定制衣柜加盟 | 搅拌磨|搅拌球磨机|循环磨|循环球磨机-无锡市少宏粉体科技有限公司 | ETFE膜结构_PTFE膜结构_空间钢结构_膜结构_张拉膜_浙江萬豪空间结构集团有限公司 | 防锈油-助焊剂-光学玻璃清洗剂-贝塔防锈油生产厂家 | 废旧物资回收公司_广州废旧设备回收_报废设备物资回收-益美工厂设备回收公司 | 螺钉式热电偶_便携式温度传感器_压簧式热电偶|无锡联泰仪表有限公司|首页 | 单级/双级旋片式真空泵厂家,2xz旋片真空泵-浙江台州求精真空泵有限公司 | 智成电子深圳tdk一级代理-提供TDK电容电感贴片蜂鸣器磁芯lambda电源代理经销,TDK代理商有哪些TDK一级代理商排名查询。-深圳tdk一级代理 | 压缩空气冷冻式干燥机_吸附式干燥机_吸干机_沪盛冷干机 | 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 合肥卓创建筑装饰,专业办公室装饰、商业空间装修与设计。 | 耐高温电缆厂家-远洋高温电缆 | 广州展台特装搭建商|特装展位设计搭建|展会特装搭建|特装展台制作设计|展览特装公司 | 章丘丰源机械有限公司 - 三叶罗茨风机,罗茨鼓风机,罗茨风机 | 米顿罗计量泵(科普)——韬铭机械 | 除尘器布袋骨架,除尘器滤袋,除尘器骨架,电磁脉冲阀膜片,卸灰阀,螺旋输送机-泊头市天润环保机械设备有限公司 | 北京签证代办_签证办理_商务签证_旅游签证_寰球签证网 |