MySQL explain命令实操

explain作用

explain命令是用来查看一个sql语句的执行计划,可以看出这个sql语句是否使用到索引,是否合理可用。

explain返回参数说明

  1. 作用于一个select sql语句:
explain select id from tb_delivery_user_owner where user_id=1;

得到如下图结果:


image.png

2.作用于一个update sql:

explain update tb_delivery_user_owner set deleted = 0 where   delivery_user_id=1;
image.png

重点解释以下几个字段:

type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、index和ALL
type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL ,一般来说,得保证查询至少达到range级别,最好能达到ref。具体说明,如下图:


image.png

key: 实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MySQL会选择优化不足的索引。这种情况下,可以在select语句中使用use index(indexname) 来强制使用一个索引或者用ignore index(indexname) 来强制MySQL忽略索引

key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好;也可以根据这个长度判断组合索引是用了部分字段还是所有字段。

ref:显示索引的哪一列被使用了,如果可能的话,是一个常数

rows:预计查询扫描的数据行数

Extra:关于MySQL如何解析查询的附加信息,如下图所示:


image.png

explain实操

CREATE TABLE `tb_delivery_user_owner` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `delivery_user_id` int(11) NOT NULL COMMENT '投放账号ID',
  `user_id` int(11) NOT NULL COMMENT '使用者用户ID',
  `deleted` tinyint(1) NOT NULL DEFAULT '0',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uniq_idx_delivery_owner` (`delivery_user_id`,`user_id`),
  KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='投放账号使用者表';

从建表sql知道表tb_delivery_user_owner有一个组合唯一索引uniq_idx_delivery_owner,索引的第一个字段为delivery_user_id,第二字段为user_id。

  1. 先看第一个sql语句:


    image.png

    显然使用了索引:uniq_idx_delivery_owner,type=const表明基于索引查询,key_len=8说明使用了完整的2个列。

  2. 然后看第二个sql:


    image.png

似乎也用到了索引,但是根据最左匹配原则,user_id作为第二个字段应该用不到索引。这是什么原因呢?最左匹配原则在这里不适用了吗?

解释:这里是使用到索引,但是type=index说明是索引覆盖扫描,需要扫描整个索引表,实际上效果并不好。根据最左匹配原则,user_id不满足,但是它在组合索引列里,所以直接查所有的索引。

接下来看下如果select的列不一样是否有什么不同:


image.png

从图上看到create_time字段不是索引列,当它被select的时候直接就是全表扫描了,这是因为create_time不在索引表中,不能查索引表只能原表扫描。可见查询sql中,除了where条件外select的具体列也会有影响最终执行性能。

总结

  1. explain用于查看sql执行计划,可以分析是否用到索引,便于优化sql
  2. explain的结果除了和where条件有关,还和select的列有关。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容