范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

MySQL之Explain性能分析

  一、Explain 概述
  使用 EXPLAIN 关键字可以模拟优化器来执行SQL查询语句,从而知道MySQL是如何处理我们的SQL语句的。分析出查询语句或是表结构的性能瓶颈。 1、MySQL查询过程
  通过explain我们可以获得以下信息: 表的读取顺序; 数据读取操作的操作类型; 哪些索引可以被使用; 哪些索引真正被使用; 表的直接引用; 每张表的有多少行被优化器查询了;
  Explain使用方式:  explain+sql语句 , 通过执行explain可以获得sql语句执行的相关信息。 explain select * from L1;
  二、Explain 详解
  1) 数据准备 -- 创建数据库  CREATE DATABASE test_explain CHARACTER SET "utf8";   -- 创建表  CREATE TABLE L1(id INT PRIMARY KEY AUTO_INCREMENT,title VARCHAR(100) ); CREATE TABLE L2(id INT PRIMARY KEY AUTO_INCREMENT,title VARCHAR(100) );  CREATE TABLE L3(id INT PRIMARY KEY AUTO_INCREMENT,title VARCHAR(100) );  CREATE TABLE L4(id INT PRIMARY KEY AUTO_INCREMENT,title VARCHAR(100) );   -- 每张表插入3条数据  INSERT INTO L1(title) VALUES("zhang001"),("zhang002"),("zhang003");  INSERT INTO L2(title) VALUES("zhang004"),("zhang005"),("zhang006");  INSERT INTO L3(title) VALUES("zhang007"),("zhang008"),("zhang009");  INSERT INTO L4(title) VALUES("zhang010"),("zhang011"),("zhang012");
  2) ID字段说明
  select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序
  id相同,执行顺序由上至下 EXPLAIN SELECT * FROM L1,L2,L3 WHERE L1.id=L2.id AND L2.id = L3.id;
  id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行EXPLAIN SELECT * FROM L2 WHERE id = ( SELECT id FROM L1 WHERE id = (SELECT L3.id FROM L3 WHERE L3.title = "zhang"));
  3) select_type和table字段说明
  表示查询类型,主要用于区别普通查询,联合查询,子查询等的复杂查询
  simple :  简单的select查询,查询中不包含子查询或者UNION EXPLAIN SELECT * FROM L1 where id = 1;
  primary :  查询中若包含任何复杂的子部分,最外层查询被标记
  subquery :  在select或where列表中包含了子查询 EXPLAIN SELECT * FROM L2 WHERE id = ( SELECT id FROM L1 WHERE id = (SELECT L3.id FROM L3 WHERE L3.title = "zhang"));
  union :  union连接的两个select查询,第一个查询是dervied派生表,除了第一个表外,第二个以后的表select_type都是union
  derived :  在from列表中包含的子查询被标记为derived(派生表),MySQL会递归执行这些子查询,把结果放到临时表中
  union result :  UNION 的结果 EXPLAIN SELECT * FROM (select * from L3 union select * from L4)a;
  4) type字段说明
  type字段在 MySQL 官网文档描述如下:
  The join type. For descriptions of the difffferent types.
  type字段显示的是连接类型 ( join type表示的是用什么样的方式来获取数据),它描述了找到所需数据所使用的扫描方式, 是较为重要的一个指标。
  下面给出各种连接类型,按照从最佳类型到最坏类型进行排序: -- 完整的连接类型比较多  system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL   -- 简化之后,我们可以只关注一下几种  system > const > eq_ref > ref > range > index > ALL
  一般来说,需要保证查询至少达到 range级别,最好能到ref,否则就要就行SQL的优化调整
  下面介绍type字段不同值表示的含义:
  system:  表中就仅有一行数据的时候. 这是const连接类型的一个特例,很少出现。
  const:  const表示命中主键索引(primary key) 或者唯一索引(unique),表示通过索引一次就找到数据记录。因为只匹配一条记录,所以被连接的部分是一个常量。(如果将主键放在 where条件中, MySQL就能将该查询转换为一个常量) 这种类型非常快。
  例如以下查询: explain select * from L1 where id = 3;  -- 为L1表的title字段添加唯一索引 alter table L1 add unique(title);  explain select * from L1 where title = "zhang";
  eq_ref  : 对于前一个表中的每个一行,后表只有一行被扫描。除了system和const类型之外,这是最好的连接类型。只有当联接使用索引的部分都是主键或惟一非空索引时,才会出现这种类型。
  例如以下查询: EXPLAIN SELECT L1.id,L1.title FROM L1 left join L2 on L1.id = L2.id;
  ref  : 非唯一性索引扫描(使用了普通索引), 对于前表的每一行(row),后表可能有多于一行的数据被扫描,它返回所有匹配某个单独值的行。
  例如以下查询: -- 为L1表的title字段添加普通索引 alter table L1 add index idx_title (title) ; EXPLAIN SELECT * FROM L1 inner join L2 on L1.title = L2.title;
  range  : 索引上的范围查询,检索给定范围的行,between,in函数,> 都是典型的范围(range)查询。
  例如以下查询: EXPLAIN SELECT * FROM L1 WHERE L1.id between 1 and 10;
  注: 当in函数中的数据很大时,可能会导致效率下降,最终不走索引
  index  : 出现index 是 SQL 使用了索引, 但是没有通过索引进行过滤,需要扫描索引上的全部数据 ( 查找所有索引树,比ALL快一些,因为索引文件要比数据文件小   ), 一般是使用了索引进行排序分组。 EXPLAIN SELECT * FROM L2 group by id order by id;  -- 该count查询需要通过扫描索引上的全部数据来计数 EXPLAIN SELECT count(*) FROM L2;
  ALL  : 没有使用到任何索引, 连接查询时对于前表的每一行,后表都要被全表扫描。 EXPLAIN SELECT * FROM L3 inner join L4 on L3.title = L4.title;
  总结各类type类型的特点:
  5) possible_keys 与 key说明
  possible_keys
  显示可能应用到这张表上的索引 , 一个或者多个. 查询涉及到的字段上若存在索引, 则该索引将被列出, 但不一定被查询实际使用.
  key
  实际使用的索引 ,若为null,则没有使用到索引。(两种可能,1.没建立索引, 2.建立索引,但索引失效)。查询中若使用了覆盖索引,则该索引仅出现在key列表中。
  1. 理论上没有使用索引,但实际上使用了 EXPLAIN SELECT L3.id FROM L3;
  2. 理论和实际上都没有使用索引 EXPLAIN SELECT * FROM L3 WHERE title = "zhang007";
  3. 理论和实际上都使用了索引 EXPLAIN SELECT * FROM L2 WHERE title = "zhang004";
  6) key_len字段说明
  表示索引中使用的字节数, 可以通过该列计算查询中使用索引的长度。
  key_len 字段能够帮你检查是否充分利用了索引,  ken_len 越长, 说明索引使用的越充分。
  创建表
  CREATE TABLE L5( 	a INT PRIMARY KEY, 	b INT NOT NULL, 	c INT DEFAULT NULL, 	d CHAR(10) NOT NULL );
  使用explain 进行测试 EXPLAIN SELECT * FROM L5 WHERE a > 1 AND b = 1;
  观察key_len的值, 索引中只包含了1列 是int类型 ,所以,key_len是4字节。
  为b字段添加索引,进行测试
  ALTER TABLE L5 ADD INDEX idx_b(b);  -- 执行SQL,这次将b字段也作为条件 EXPLAIN SELECT * FROM L5 WHERE a > 1 AND b = 1;
  为c、d字段添加联合索引,然后进行测试 ALTER TABLE L5 ADD INDEX idx_c_b(c,d);   explain select * from L5 where c = 1 and d = "";
  c字段是int类型 4个字节, d字段是 char(10)代表的是10个字符相当30个字节
  数据库的字符集是utf8 一个字符3个字节,d字段是 char(10)代表的是10个字符相当30个字节,多出的一个字节用来表示是联合索引
  下面这个例子中,虽然使用了联合索引,但是可以根据ken_len的长度推测出该联合索引只使用了一部分,没有充分利用索引,还有优化空间。 explain select * from L5 where c = 1 ;
  7) ref 字段说明
  显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值
  L1.id="1"; 1是常量 , ref = const EXPLAIN SELECT * FROM L1 WHERE L1.id=1;
  8) rows 字段说明
  表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数。
  L3中的title没有添加索引, 所以L3中有3条记录,就需要读取3条记录进行查找。 EXPLAIN SELECT * FROM L3,L4 WHERE L3.id = L4.id AND L3.title LIKE "zhang007";
  需要注意的是 rows只是一个估算值,并不准确 .所以rows行数过大的问题并不值得过多考虑,主要分析的还是索引是否使用正确了
  9) fifiltered 字段说明
  它指返回结果的行占需要读到的行(rows列的值)的百分比。
  10) extra 字段说明
  Extra 是 EXPLAIN 输出中另外一个很重要的列,该列显示MySQL在查询过程中的一些详细信息。
  准备数据
  CREATE TABLE users ( uid INT PRIMARY KEY AUTO_INCREMENT, uname VARCHAR(20), age INT(11) );  INSERT INTO users VALUES(NULL, "lisa",10); INSERT INTO users VALUES(NULL, "lisa",10); INSERT INTO users VALUES(NULL, "rose",11); INSERT INTO users VALUES(NULL, "jack", 12); INSERT INTO users VALUES(NULL, "sam", 13);
  Using fifilesort
  执行结果Extra为 Using filesort ,这说明,得到所需结果集,需要对所有记录进行文件排序。这类SQL语句性能极差,需要进行优化。
  典型的,在一个没有建立索引的列上进行了order by,就会触发fifilesort,常见的优化方案是,在order by的列上添加索引,避免每次查询都全量排序。 EXPLAIN SELECT * FROM users ORDER BY age;
  Using temporary
  表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询 EXPLAIN SELECT COUNT(*),uname FROM users GROUP BY uname;
  需要注意的是: 返回所有记录的SQL,不使用where条件过滤数据,大概率不符合预期,对于这类SQL往往需要进行优化; 使用了where条件的SQL,并不代表不需要优化,往往需要配合explain结果中的type(连接类型)来综合判断。例如本例查询的 age 未设置索引,所以返回的type为ALL,仍有优化空间,可以建立索引优化查询。 EXPLAIN SELECT * FROM users WHERE age=10;
  Using index
  表示直接访问索引就能够获取到所需要的数据(覆盖索引) , 不需要通过索引回表。 -- 为uname创建索引 alter table users add index idx_uname(uname); EXPLAIN SELECT uid,uname FROM users WHERE uname="lisa";
  Using join buffffer
  使用了连接缓存, 会显示join连接查询时,MySQL选择的查询算法。 EXPLAIN SELECT * FROM users u1 LEFT JOIN (SELECT * FROM users WHERE age = 1)u2 ON u1.age = u2.age;
  Using join buffer (Block Nested Loop) 说明,需要进行嵌套循环计算, 这里每个表都有五
  条记录,内外表查询的type都为ALL。
  问题在于 两个关联表的关联使用了字段 age,并且age字段未建立索引,就会出现这种情况。
  Using index condition
  查找使用了索引 (但是只使用了一部分,一般是指联合索引),但是需要回表查询数. explain select * from L5 where c > 10 and d = "";
  Extra主要指标的含义(有时会同时出现) using index : 使用覆盖索引的时候就会出现; using where : 在查找使用索引的情况下,需要回表去查询所需的数据; using index condition : 查找使用了索引,但是需要回表查询数据; using index & using where : 查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据;

美国专家美国经济会越来越糟糕吗?尽管美国经济政策制定者百般努力,美国经济仍未摆脱困境。如今,美国通货膨胀率在飙升,劳动参与率则继续下降。漫画作者中国日报石宇越来越多的美国人面临着食品和油气价格上涨以及就业率下降带佳能21年来首次新建光刻机工厂,欲将产能翻倍近日,日本佳能公司表示,将投资超500亿日元(约合24。6亿元人民币),在日本栃木县宇都宫市新建半导体设备工厂,占地面积约7万平方米,主要增产光刻设备,建成后预计产能将提高2倍。新农业银行怎么设置微信提醒农业银行设置微信提醒的方法是在公众号中我的账户下开启动账提醒。详细操作步骤如下01怎么设置1在微信界面,单击搜索。2进入搜索界面,单击公众号。3在输入栏输入中国农业银行,在搜索结果房地产之后,国家经济发展的下一个布局是什么丰收中国之前,国家布局房地产,让房地产成为了促进我国经济发展的支柱产业。因为房地产,地方政府靠卖地和增长的税收支撑其各种支出,地方GDP也迅猛成长,同时也拉动着建材建筑业的成长,并交广会客厅从职场小白到管理骨干晋中站,位于中国山西晋中市榆次区,是中国铁路太原局集团有限公司管辖的一座二等车站,主要办理太中银铁路大西高铁郑太高铁旅客运输业务。2022年10月,是常远任职太原房建公寓段晋中维修李宇春患强直性脊柱炎,不能睡觉,需要坐轮椅,专家此病是造成中青年致残的主要原因之一近日,李宇春作客我的青铜时代节目时,首次袒露自己患上了强直性脊柱炎,一度严重到不能睡觉需要坐轮椅。她表示,去年突然被医生告知患有强直性脊柱炎,这是她从来没有预想过的,在她看来这也算中文版首次引进!这个冷门小众作家,是影响了百年孤独命运的人提到拉美文学,你会想到哪些代表名家?马尔克斯科塔萨尔略萨富恩特斯在这些闪闪发光的名字外,拉美文学的世界里还有这样一位作家他冷门小众,他的知名度不高,他的作品中文版译介数量也屈指可数尤靖茹发文辟谣恋情传闻,称自己在宁波隔离,有网友却提出了疑点明星们的恋情总是格外地引人关注,关注八卦的人也对于这类的消息比较关心。而在10月12日,刘恺威和尤靖茹就冲上了热搜,引发网友们的关注,这件事的起因是有网友在网上上传了一张视频的截图今天全世界都在看的新闻2022。10。12普京会见国际原子能机构总干事格罗西核言论政治化有风险俄罗斯总统普京10月11日与国际原子能机构总干事格罗西会晤时,讨论了扎波罗热核电站的局势,并提到核活动过度政治化的风险,呼吁减少管涛上半年全球外汇储备变动的六个基本事实要点外资对人民币债券总体上仍是坚定的持有者。这是全球人民币储备份额逆势上扬,连续十个季度上涨,不断刷新历史新高的重要原因,显示人民币国际化的官方认可程度进一步加强。日前,国际货币基看电影玩游戏看网课的超豪华选项峰米T1全色激光电视哈喽大家好,我是老纪很大力!今天给大家介绍的是一台全色激光电视峰米T1。投影仪我用过很多,这是我用过的第一台激光电视,惭愧的说我之前对激光电视的误解有点大,这台峰米T1重新改变了我
夜咳剧烈咽痒痰不黄,中医经典方剂1首,利咽降气,化痰止咳天气寒冷或早晚温差大,人体骤受风寒,引起咳嗽,白天轻夜晚重,喉痒,干咳(或白稀痰),流清涕,怕冷,头痛,浑身不适,舌苔白色。饮食上必须远离寒凉瓜果,不宜吃冷饮冷冻食品。中医认为形寒养生冬季养肾正当时,如何把肾养好?做好这4点是关键!冬季,五行属水,五脏属肾。肾是先天之本,人体生命的原动力。人体阳气收藏,水湿不易从体表散发,大部分经从肾膀胱运化外泄,无形增加了其负担。因此,冬季养生首要是养肾。肾对于人体来说特别篮网逆转鹈鹕!KD33分,欧文杀死比赛,赵四2射齐爆,乔哈无作用北京时间1月7号鹈鹕和篮网的比赛,上半场鹈鹕保持领先,但第三节篮网打出足够攻势之后,一波迫近比分。末节双方保持极度焦灼的趋势,但篮网这边能站出来的人更多,这也让他们始终保持微弱的优奥利奥与微软联名推出Xbox主题饼干,包装内有皮肤cdk哈喽大家好,这里是亿游聚合,每天为你分享游戏相关的内容,喜欢的快来关注哟1月9日最新消息,奥利奥与微软再次进行合作,本次奥利奥推出了以Xbox为主题的新款饼干,奥利奥以以Xbox为办公娱乐两不误!荣耀平板V8Pro到手2569元真的香手机中国行情对于绝大部分用户来说,购买平板电脑的动机主要还是工作和学习,毕竟平板屏幕更大,生产力也更强。当然,平板电脑也有很强的娱乐属性,比如看电影等。前不久,荣耀推出了荣耀平板V荣耀70再次降价,8256GB不足2300元,比荣耀80更值得推荐如果说高端机更看注重体验和品牌,那么中端机更看重是在配置方面的堆料,而国内20003000元手机市场竞争尤为激烈,各个品牌都给出了诚意,如红米K系列和iQOONEO系列,这两个系列荣耀成长新困局独立两年,难成华为经济观察报记者钱玉娟广州报道2023年元旦前后的多个夜晚,陈伟都是在酒局上度过的。陈伟是荣耀一家全国代理商(下文简称国代)公司的管理高层,经济观察报记者与他取得联系时,陈伟正约了几皮肤大爆料!13款皮肤曝光,貂蝉典藏,猴子传说将上线,兔年限定皮肤大爆料!13款皮肤曝光,新典藏泄漏,猴子传说本周上线,兔年限定三传说?情人节未来风!这两天看到朋友圈在纷纷抢票,看了下日历才发现距离春节只剩不到两周时间,不知道是不是因为放开的王者荣耀中,亚瑟的狮心王皮肤算得上很稀有吗?前言各位小伙伴大家好,这里是不仅游戏打得6,长得还很帅的熊猫哥哥王者荣耀这款游戏到目前已经走过了七八年的时光,推出了100多个英雄以及400多款皮肤,其中总有一些推出时间比较久的皮新买了笔记本,第一次开机要注意什么?90的人都做错了根据网络分析机构Statcounter的最新数据,12月全球已有16。93的PC正在运行Windows11系统,相比上个月的15。44已经出现了明显的上升趋势。相关人员也曾表示到目DPU入局者,如何行稳致远?左手算力右手网络的算网时代正加速驶来,这也使得DPU备受关注。在全球算力的急剧增长之下,受制于摩尔定律的CPU或将60以上的资源分配于网络层面的处理,使得应用层处理捉襟见肘,出现巨