mysqlexplain各个字段作用(MySQL EXPLAIN语句的使用示例)
mysqlexplain各个字段作用
MySQL EXPLAIN语句的使用示例在mysql优化的环节上,我们首先需要知道的就是我们当前的这句sql语句在实际的数据库中究竟是怎么执行的,才能谈要如何优化它。而在mysql中,就给我们提供了模拟语句执行的一个非常好用的关键字:explain。explain可以用来查看sql语句的执行效果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。因此今天我们就来讲一讲这个关键字的一些基础的用法与应用。
一、使用方法
explain的使用方法非常简单:
|
mysql> explain select * from user ; |
简单来说,就是在原有的sql语句前面加上explain关键字,或者说是在explain关键字后跟这你要检查的sql语句。
二、输出结果
explain语句的输出结果才是我们想要的数据,也是我们分析的重点。
我们先来看看上面的语句所给到的对应的结果的形式:
|
+ ----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | extra | + ----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+ | 1 | simple | user | null | all | null | null | null | null | 3 | 100.00 | null | + ----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+ |
explain语句给到我们的数据总共有10列,接下来我们看一下一些在性能优化上有比较重要作用的数据列所代表的意思。
1.id
这个是select查询的序列号。
2.select_type
当我们的sql语句是非select语句的时候(即delete,update...),这个字段的值就是对应的操作类型(delete,update...)。
|
mysql> explain insert into user vaules(2, 'ahong' , '31' ); |
此时的输出select_type就是我们对应的insert:
|
+ ----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | extra | + ----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+ | 1 | insert | user | null | all | null | null | null | null | null | null | null | + ----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+ |
而当sql语句时select语句的时候,他就是对应的一些详细的select的类型,可以有如下几种:
|
simple:简单 select (不使用 union 或子查询等) primary :最外面的 select union : union 中的第二个或后面的 select 语句 dependent union : union 中的第二个或后面的 select 语句,取决于外面的查询 union result: union 的结果。 subquery:子查询中的第一个 select dependent subquery:子查询中的第一个 select ,取决于外面的查询 derived:导出表的 select ( from 子句的子查询) |
下面就是一个最简单的simple查询的例子:
|
mysql> explain select * from user ; |
|
+ ----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | extra | + ----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+ | 1 | simple | user | null | all | null | null | null | null | 3 | 100.00 | null | + ----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+ |
3.table
显示这一步操作所访问的数据是关于哪一张表的。
4.partitions
显示表所使用的分区,如果要统计十年公司订单的金额,可以把数据分为十个区,每一年代表一个区。这样可以大大的提高查询效率。
5.type
这是最重要的一列。显示了连接使用了哪种类别,有无使用索引。是分析查询性能的关键。
结果性能从优到差分别有以下的情况:
|
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > all |
而这几种情况所代表的意义如下:
- system、const: 可以将查询的变量转为常量. 如id=1; id为 主键或唯一键.
- eq_ref: 访问索引,返回某单一行的数据.(通常在联接时出现,查询使用的索引为主键或惟一键)
- ref: 访问索引,返回某个值的数据.(可以返回多行) 通常使用=时发生
- range: 这个连接类型使用索引返回一个范围中的行,比如使用>或<查找东西,并且该字段上建有索引时发生的情况(注:不一定好于index)
- index: 以索引的顺序进行全表扫描,优点是不用排序,缺点是还要全表扫描
- all: 全表扫描,应该尽量避免_
一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题。
6.possible_key
显示查询语句有可能会使用到的索引列。取值可能为一个,多个或者null。
7.key
key列显示的是该查询语句实际使用的索引列。如为null,则表示没有使用索引。
展示一下possible_key和key的实际效果:
下面是一个在age列上建立索引的数据表,我们进行以下的查询
|
mysql> explain select * from user where age = 1; |
会得到以下的结果:
|
+ ----+-------------+-------+------------+------+---------------+------+---------+-------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | extra | + ----+-------------+-------+------------+------+---------------+------+---------+-------+------+----------+-------+ | 1 | simple | user | null | ref | age | age | 5 | const | 1 | 100.00 | null | + ----+-------------+-------+------------+------+---------------+------+---------+-------+------+----------+-------+ |
8.key_len
显示的是当前的查询语句所使用的索引的长度。在不损失精确性的情况下,长度越短越好.
9.ref
引用到的上一个表的列。
10.rows
根据表的情况和查询语句的情况,mysql会估算出返回最终结果所必须检查的行的数量。该列的值越大查询效率越差。
11.filtered
一个百分比的值,和rows 列的值一起使用,可以估计出查询执行计划(qep)中的前一个表的结果集,从而确定join操作的循环次数。小表驱动大表,减轻连接的次数。
12.extra
关于mysql如何解析查询的额外信息,主要有以下几种:
extra中包含的值:
- using index: 只用到索引,可以避免访问表,性能很高。
- using where: 使用到where来过滤数据, 不是所有的where clause都要显示using where. 如以=方式访问索引。
- using tmporary: 用到临时表去处理当前的查询。
- using filesort: 用到额外的排序,此时mysql会根据联接类型浏览所有符合条件的记录,并保存排序关键字和行指针,然后排序关键字并按顺序检索行。(当使用order by v1,而没用到索引时,就会使用额外的排序)。
- range checked for eache record(index map:n): 没有好的索引可以使用。
- using index for group-by:__表明可以在索引中找到分组所需的所有数据,不需要查询实际的表。explain select user_id from t_order group by user_id;_
以上就是mysql explain语句的使用示例的详细内容,更多关于mysql explain语句的资料请关注开心学习网其它相关文章!
原文链接:https://segmentfault.com/a/1190000038172353
- win10安装mysql8.0如何启动(win10下mysql 8.0.23 安装配置方法图文教程)
- mysql大表查询优化方案(mysql查询优化之100万条数据的一张表优化方案)
- python和mysql实战(由Python编写的MySQL管理工具代码实例)
- mysql 命令与sqlserver的区别大么(MySQL系列之执行SQL 语句时发生了什么?)
- mysql函数编写(MySQL中sum函数使用的实例教程)
- mysql双主状态不一致(MySQL GTID主备不一致的修复方案)
- mysql的limit的分页使用(获取 MySQL innodb B+tree 的高度的方法)
- mysql innodb存储原理(mysql innodb的重要组件汇总)
- mysql怎么查看表的字段(Mysql 获取表的comment 字段操作)
- 如何清除mysql的binlog
- iis上搭建php环境(vultr服务器windows server 2012 r2搭建IIS8+PHP+MYSQL+phpMyAdmin运行环境图文教程)
- MySql存储过程
- rename重命名mysql表(MySQL 重命名表的操作方法及注意事项)
- mysql 查询语法常见问题(MySQL 异常有这一篇就够了!)
- mysql自增锁(深入剖析 MySQL 自增锁)
- MySql中date、datetime、time类型的区别
- 太鸡贼了,这老小区轻松搞定了停车问题(这老小区轻松搞定了停车问题)
- 节日我在岗|警景相融 平安相伴(节日我在岗警景相融)
- 战 疫 时刻 致敬每一位石化大学的 守护者(战疫时刻)
- 老弄堂里的市井味道(老弄堂里的市井味道)
- 小米音乐可绑定QQ音乐, QQ音乐 真的会消失在小米的设备上吗(小米音乐可绑定QQ音乐)
- 小米Watch S1评测 或许能成为小米冲击高端可穿戴设备的里程碑(小米WatchS1评测或许能成为小米冲击高端可穿戴设备的里程碑)
热门推荐
- css中width:auto和width:100%的区别
- 带农历的js日期控件
- js如何将json字符串转换为json对象
- css垂直左右居中的方式(css常用元素水平垂直居中方案)
- dedecms修改教程(还原dedecms数据后系统基本参数空白的解决方法)
- laravel自定义使用方法(laravel 获取当前url的别名方法)
- python写一个二叉树(Python二叉搜索树与双向链表转换算法示例)
- python读取数据集的图片(浅析Python 读取图像文件的性能对比)
- 阿里云ecs怎么当成云主机用(阿里云ECS服务器入门使用流程新手必看教程)
- python中mod函数的使用方法(详解Python3中ceil函数用法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9