1、MySQL语法

MySql提供了EXPLAIN语法用来进行查询分析,在SQL语句前加一个”EXPLAIN”即可。

默认情况下Mysql的profiling是关闭的,所以首先必须打开profiling

set profiling="ON"

mysql> show variables like "%profi%";

+------------------------+-------+

| Variable_name | Value |

+------------------------+-------+

| profiling | ON |

show processlist; 查看现在在运行的所有进程列表,在进程列表中我们唯一需要的是ID

mysql> show processlist;

+----+------+----------------+-----------+---------+------+-------+-------------

-----+

SHOW PROFILES Syntax:

SHOW PROFILE [type [, type] ... ]

[FOR QUERY n]

[LIMIT row_count [OFFSET offset]]

type:

ALL

| BLOCK IO

| CONTEXT SWITCHES

| CPU

| IPC

| MEMORY

| PAGE FAULTS

| SOURCE

| SWAPS

2、Navicat工具

打开profile分析工具:

i

查看是否生效:show variable like ‘%profil%’;

查看进程:show processlist;

选择数据库:use db_jiakao;

全部分析的类型:show PROFILE all;

查看表索引:show index from user_member;##查看表索引

使用explain命令查看query语句的性能:

EXPLAIN select * from user_feedback;##查看执行计划中的sql性能

第一个查询是全表扫描,第二个是索引扫描:

区别在于type:all是全表扫描 index 通过索引扫描

或者在查询中输入需要查看执行计划的语句,点击执行,然后点击解释。选择解释标签,就可以查看到sql的执行计划了

解释

1、ID、table

id:Query Optimizer 所选定的执行计划中查询的序列号

id相同时,执行顺序由上至下

如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行

3.id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行

table:显示这一行的数据是关于哪张表的

2、type

显示连接使用了何种类型,对表所使用的访问方式。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL

说明:不同连接类型的解释(按照效率高低的顺序排序)system:系统表,表中只有一行数据。这是const连接类型的特殊情况。

const :读常量,且最多只会有一条记录匹配。表中的一个记录的最大值能够匹配这个查询(索引可以是主键或惟一索引)。因为只有一行,这个值实际就是常数,因为MYSQL先读这个值然后把它当做常数来对待。

eq_ref:最多只会有一条匹配结果,一般是通过主键或者唯一键索引来访问;在连接中,MYSQL在查询时,从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用。

ref:Join 语句中被驱动表索引引用查询,这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中读出。这个类型严重依赖于根据索引匹配的记录多少—越少越好。

range:索引范围扫描,这个连接类型使用索引返回一个范围中的行,比如使用>或

查找东西时发生的情况。>

refornull:与ref 的唯一区别就是在使用索引引用查询之外再增加一个空值的查询。

unique_subquery:子查询中的返回结果字段组合是主键或者唯一约束

index_merge:查询中同时使用两个(或更多)索引,然后对索引结果进行merge 之后再读取表数据;

index_subquery:子查询中的返回结果字段组合是一个索引(或索引组合),但不是一个主键或者唯一索引;

index:全索引扫描,这个连接类型对前面的表中的每一个记录联合进行完全扫描(比ALL更好,因为索引一般小于表数据)。

ALL:全表扫描,这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免。

3、possiblekeys 、keylen

possible_keys显示可能应用在这张表中的索引。这里的索引名字是创建索引时指定的索引昵称;如果索引没有昵称,则默认显示的是索引中第一个列的名字。如果为空,没有可能的索引,可以为相关的域从WHERE语句中选择一个合适的语句

key_len表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(keylen显示的值为索引字段的最大可能长度,并非实际使用长度,即keylen是根据表定义计算而得,不是通过表内检索出的)不损失精确性的情况下,长度越短越好

4、key

实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引key_len使用的索引的长度。在不损失精确性的情况下,长度越短越好

5、ref

显示的是列的名字,显示索引的哪一列被使用了,MySQL将根据这些列来选择行,如果可能的话,是一个常数 。“对于每一种与另一个表中记录的组合,MySQL将从当前的表读取所有带有匹配索引值的记录。如果连接操作只使用键的最左前缀,或者如果键不是 UNIQUE或PRIMARY KEY类型(换句话说,如果连接操作不能根据键值选择出唯一行),则MySQL使用ref连接类型。如果连接操作所用的键只匹配少量的记录,则ref是一 种好的连接类型。”

6、rows

MYSQL认为必须检查的用来返回请求数据的行数 ,这里最理想的数字就是1。

7、select_type

所使用的查询类型,判断是否是复杂语句,主要有以下这几种查询类型

DEPENDENT SUBQUERY:子查询中内层的第一个SELECT,依赖于外部查询的结果集;DEPENDENT UNION:子查询中的UNION,且为UNION 中从第二个SELECT 开始的后面所有SELECT,同样依赖于外部查询的结果集;PRIMARY:子查询中的最外层查询,注意并不是主键查询;SIMPLE:除子查询或者UNION 之外的其他查询;SUBQUERY:子查询内层查询的第一个SELECT,结果不依赖于外部查询结果集;UNCACHEABLE SUBQUERY:结果集无法缓存的子查询;UNION:UNION 语句中第二个SELECT 开始的后面所有SELECT,第一个SELECT 为PRIMARYUNION RESULT:UNION 中的合并结果;DERIVED:派生表的SELECT, FROM子句的子查询

8、Extra

关于MYSQL如何解析查询的额外信息。将在表4.3中讨论,但这里可以看到的坏的例子是Using temporary和Using filesort,意思MYSQL根本不能使用索引,结果是检索会很慢

说明:extra列返回的描述的意义

Distinct :一旦mysql找到了与行相联合匹配的行,就不再搜索了。

Not exists :mysql优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,就不再搜索了。

No tables:Query 语句中使用FROM DUAL 或者不包含任何FROM 子句;

Using filesort:当我们的Query 中包含ORDER BY 操作,而且无法利用索引完成排序操作的时候,MySQL Query Optimizer 不得不选择相应的排序算法来实现。看到这个的时候,查询就需要优化了。mysql需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行。

Using index:所需要的数据只需要在Index 即可全部获得而不需要再到表中取数据。列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候。

Using temporary :当MySQL 在某些操作中必须使用临时表的时候,在Extra 信息中就会出现Using temporary 。主要常见于GROUP BY 和ORDER BY 等操作中。看到这个的时候,查询需要优化了。这里,mysql需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上。

Using where:如果我们不是读取表的所有数据,或者不是仅仅通过索引就可以获取所有需要的数据,则会出现Using where 信息;

Where used:使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题。

Using index for group-by:数据访问和Using index 一样,所需数据只需要读取索引即可,而当Query 中使用了GROUP BY 或者DISTINCT 子句的时候,如果分组字段也在索引中,Extra 中的信息就会是Using index for group-by;

Using where with pushed condition:这是一个仅仅在NDBCluster 存储引擎中才会出现的信息,而且还需要通过打开Condition Pushdown 优化功能才可能会被使用。控制参数为engineconditionpushdown 。

Full scan on NULL key:子查询中的一种优化方式,主要在遇到无法通过索引访问null值的使用使用;

Impossible WHERE noticed after reading const tables:MySQL Query Optimizer 通过收集到的统计信息判断出不可能存在结果;

Select tables optimized away:当我们使用某些聚合函数来访问存在索引的某个字段的时候,MySQL Query Optimizer 会通过索引而直接一次定位到所需的数据行完成整个查询。当然,前提是在Query 中不能有GROUP BY 操作。如使用MIN()或者MAX()的时候;

Range checked for each Record(index map:#) :没有找到理想的索引,因此对从前面表中来的每一个行组合,mysql检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一。

总结

• EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况• EXPLAIN不考虑各种Cache• EXPLAIN不能显示MySQL在执行查询时所作的优化工作• 部分统计信息是估算的,并非精确值• EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划。

因此,弄明白了explain语法返回的每一项结果,我们就能知道查询大致的运行时间了,如果查询里没有用到索引、或者需要扫描的行过多,那么可以感到明显的延迟。因此需要改变查询方式或者新建索引。mysql中的explain语法可以帮助我们改写查询,优化表的结构和索引的设置,从而最大地提高查询效率。当然,在大规模数据量时,索引的建立和维护的代价也是很高的,往往需要较长的时间和较大的空间,如果在不同的列组合上建立索引,空间的开销会更大。因此索引最好设置在需要经常查询的字段中

mysql执行计划查看_查看Mysql执行计划相关推荐

  1. mysql 查询事务信息_查看MySQL最近的事务执行信息

    查看MySQL最近的事务执行信息 发布时间:2020-03-03 12:35:07 来源:51CTO 阅读:103 作者:wjw555 课题:查看MySQL最近的事务执行信息 *虽然我们可以通过查询慢 ...

  2. mysql 执行计划不对_关于mysql主从查询执行计划不一致问题的分析

    最近面试过程中被面试官抛了一个问题,说曾经有一个线上出现的奇怪的问题,主库和从库各种配置是一致的,当数据量比较大的时候,某些时候同样的查询,在从库里的执行计划执行成功了,而主库里没有执行这个执行计划, ...

  3. mysql数据库字符集设置_查看和设置MySQL数据库字符集

    查看和设置MySQL数据库字符集作者:scorpio 2008-01-21 10:05:17 标签: 杂谈 Liunx下修改MySQL字符集:1.查找MySQL的cnf文件的位置find / -ina ...

  4. mysql pool返回值_【Mysql】你知道一条查询语句是如何执行的吗?

    [Mysql]你知道一条查询语句是如何执行的吗?​mp.weixin.qq.com 前言 在默认大家学习了Mysql结构的基础上,我们来深入的解析一下sql语句在mysql中是如何流转和实现的.本文会 ...

  5. mysql 查询默认编码_查看及修改MYSQL默认编码

    MySQL的默认是Latin1,不支持中文,要支持中文需要把数据库的默认修改为gbk或者utf8. 1.需要以root用户身份登陆才可以查看数据库编码方式 (以root用户身份登陆的命令为:>s ...

  6. mysql字符集查看_查看和设置mysql字符集

    http://218.194.248.2/~wuxiaogang/cpcourse/database/mysql/charset.htm 1. 修改mysql的my.cnf # vi /etc/my. ...

  7. mysql qps 索引查询_【MySQL】MySQL配置调优之 QPS/TPS/索引缓存命中率、innoDB索引缓存命中率、查询缓存命中率查看...

    运行中的mysql状态查看: 对正在运行的mysql进行监控,其中一个方式就是查看mysql运行状态. (1)QPS(每秒Query量) QPS = Questions(or Queries) / s ...

  8. mac mysql版本查看_查看mysql的版本号

    1.1 在命令行登录mysql,即可看到mysql的版本号 [root@heyong ~]# mysql -uroot -p Enter password: Welcome to the MySQL ...

  9. mysql 查看_查看MySQL数据库的命令

    查看MySQL数据库是我们最常用的操作之一,下面对常用的查看MySQL数据库的命令作了详尽的阐述,如果您对查看MySQL数据库方面感兴趣的话,不妨一看. 进入MySQL Command line cl ...

  10. mysql 命令执行drop 命令_(笔记)Mysql命令drop table:删除数据表

    drop table命令用于删除数据表. drop table命令格式:drop table ; 例如,删除表名为 MyClass 的表: mysql> drop table MyClass; ...

最新文章

  1. 23种设计模式(11):责任链模式
  2. shell之实战应用一(查找xml文档中的关键字段)
  3. (6) Google2012笔试卷
  4. [css] 用css3画出一个立体魔方
  5. 算法竞赛入门经典5.1 从c到c++
  6. 计算机boot进入u盘启动,电脑boot设置U盘启动项具体方法
  7. 将class文件反编译成java文件-(纯实际操作)
  8. Android 数独游戏开发,强逻辑的梳理
  9. spss26没有典型相关性分析_SPSS数据分析—典型相关分析
  10. 获取学信网学历电子版流程
  11. [物联网+云存储]-关于人工智能开关的学习思路
  12. 17、Java基础---接口
  13. 基于ArcGIS Pro、Python、USLE、INVEST模型等多技术融合的生态系统服务构建生态安全格局
  14. 亚洲和欧洲的分界线是谁划分的?
  15. 基于Tomcat的MQ学习月记
  16. [移动硬盘]笔记本移动硬盘盒选择
  17. 张勋说:关于棒磨机的历史 你了解多少?(图文)
  18. 说一说ADI公司的DSP发展历程
  19. [SAP-MDM]MDM的基本概念--主数据管理详解
  20. kali linux adb 安装教程,kali linux 使用scrcpy手机投屏

热门文章

  1. 卡苹果6plus在线_@哈尔滨家长:学生卡初次申办,需要到线下网点办理!
  2. python输出子列表_python利用递归函数输出嵌套列表的每个元素
  3. cf两边黑屏怎么解决win10_关闭自动睡眠仍然睡眠?Win10过几分钟就会自动睡眠黑屏解决方法...
  4. C语言二维数组找出交集,【leetcode C语言实现】剑指 Offer 04. 二维数组中的查找...
  5. linux将一个文件的内容复制到另一个新的文件
  6. 红黑树为什么可以确保没有一条路径会比其他路径长出两倍
  7. RabbitMQ从入门到精通
  8. Java加密与解密的艺术~安全协议~单向认证服务
  9. Java加密与解密的艺术~RSA模型分析
  10. 扩展立方体 The Scale Cube