• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

我所理解的MySQL之三:执行计划

mysql 搞代码 4年前 (2022-01-09) 20次浏览 已收录 0个评论
文章目录[隐藏]

今天MySQL数据库栏目介绍相关执行计划。

MySQL 系列的第三篇博客本文来源gao($daima.com搞@代@#码(网,主要内容是 MySQL 中关于 Explain 执行计划的分析,假如你已经知道如何分析执行计划,那么对于 SQL 调优也就信手拈来了。

纵观众多一二线大厂招聘时的岗位要求,但凡设计数据库的必定会要求有 SQL 调优的经验,这几乎已经成为与 Spring 不相上下的“八股文”类面试题。

要想进行 SQL 调优,首先需要知道 SQL 的执行情况,最直观的感觉当然是 SQL 语句执行的时间,然而除此之外,我们还可以通过执行计划来分析 SQL 语句的执行情况,从而进行调优。

1. Explain 简述

Explain 语句可以查看 MySQL 是如何执行这条 SQL 语句的,包括使用索引情况、扫描行数等,这些信息对于 SQL 调优来说十分重要,所以首先得看懂执行计划。

mysql> explain select * from user where name='one';
+----+-------------+-------+------------+------+---------------+------+---------+-------+------+----------+-------------+| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref   | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+-------+------+----------+-------------+|  1 | SIMPLE      | user  | NULL       | ref  | a             | a    | 13      | const |    1 |   100.00 | Using index |
+----+-------------+-------+------------+------+---------------+------+---------+-------+------+----------+-------------+1 row in set, 1 warning (0.00 sec)复制代码

以上是一条简单查询语句的执行计划,这张表一共有12个字段,分别代表不同的含义,下面一一叙述。

  • id: 表示 SQL 执行的顺序,值越大,优先级越高。若值相同,执行顺序由优化器决定。
  • select_type: 表示 select 查询语句的类型
  • table: SQL 语句查询的表名(或该表的别名),也可能是临时表等不存在的表
  • partitions: 查询语句涉及的分区信息
  • type: 关联类型(访问类型),决定了 MySQL 是如何查找表中行的。性能从最差到最优依次是 ALL, index, range, index_merge, ref, eq_ref, const, system, NULL
  • possible_keys: 展示了查询语句可以使用的所有索引
  • key: 展示了优化器决定采用的索引名称
  • key_len: 展示了 MySQL 使用索引长度的字节数
  • ref: 在 key 列记录的索引中查找值所使用的列或常量
  • rows: 扫描行数的估值
  • filtered: 最终满足查询语句行数占存储引擎返回总行数的百分比
  • Extra: 其他执行信息

以上只是对执行计划表各个字段的名词解释,接下来我会通过实际的例子来帮助大家(我自己)更好地理解其中 select_type, type, key_len, rows, Extra 这些重要的字段。

2. Explain 详述

2.1 示例表结构

首先介绍本文中将用到的示例表表结构以及数据行:

CREATE TABLE `user`  (  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',  `name` varchar(36) DEFAULT NULL COMMENT '姓名',  `age` int(11) NULL DEFAULT NULL COMMENT '年龄',  `email` varchar(36) DEFAULT NULL COMMENT '邮箱',
  PRIMARY KEY (`id`) USING BTREE,  INDEX `idx_age_name`(`age`, `name`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1;复制代码

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:我所理解的MySQL之三:执行计划
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址