我们在执行一条SQL语句的时候,如果我们想要知道这条SQL语句查询了哪些表,有没有使用索引,获取数据的时候遍历了多少行数据,我们可以通过EXPLAIN命令来查看这些执行信息,这些执行信息统称为执行计划。

1.使用 EXPLAIN 查看执行计划

使用方式 explain sql。

下面对图中的每一个字段进行说明。

1. id:每个执行计划都有一个id,如果是联合查询,这里还将会有多个id。

2. select_type:表示 select 的查询类型,常见的有 SIMPLE(普通查询,即没有联合查询、子查询)、PRIMARY(主查询)、UNION(UNION 中后面的查询)、SUBQUERY(子查询)等。

3. table:当前执行计划查询的表,如果给表起了别名,这里显示的就是别名信息。

4. partitions:访问的分区表信息。

5. type:表示从表中查询到行所执行的方式,这个是SQL优化中一个很重要的指标,结果值从好到差依次为:system>const>eq_ref>ref>range>index>ALL。

  • system/const:表中只有一行数据匹配,此时根据索引查询一次就能找到对应的数据
  • ​eq_ref:使用唯一索引扫描,常见于多表连接中使用主键和唯一主键索引作为关联条件。
  • ​ref:非唯一索引扫描或者唯一索引的最左匹配原则扫描。
  • ​range:索引范围扫描,比如:>,
  • ​index:索引全表扫描,此时遍历整个索引树。
  • ​ALL:表示全表扫描,需要遍历全表找到需要的行。

6. possible_keys:可能使用到的索引。

7. key:实际使用的索引。

8. ref:关联id信息。

9. rows:查找到记录扫描的行数。

10. filtered:查找所需要的记录占总扫描数的比例。

11. Extra:额外信息。

Extra通常会包含以下值:

示例表结构:

CREATE TABLE `user` (      `id` int(20) unsigned NOT NULL AUTO_INCREMENT,      `name` varchar(10) DEFAULT NULL,      `age` int(10) DEFAULT NULL,      PRIMARY KEY (`id`),      KEY `idx_unique_name` (`name`) USING BTREE    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

name字段创建了一个普通索引,age没有创建索引。

  • ​Using where:表示where条件中有非索引字段作为 条件查询。
  • Using index:表示select语句使用了覆盖索引,即在索引树中就可以找到需要查询的数据而不需要回表。
  • Using where,Using index:表示查找的列被索引覆盖,且where条件字段有索引,且为模糊查询。
  • null:表示查询的列没有被索引覆盖,如果有where条件的话,则所有的where条件必须有索引,且非模糊查询。
  • Using index condition:表示查询列没有被索引覆盖,如果有查询条件where,则查询条件字段有索引,且为模糊查询。
  • Using temporary:表示使用了临时表存储数据,比如查询语句中使用了group by,distinct等。
  • Using filesort:表示使用了文件做排序。

2.使用Show Profile 分析 SQL 执行性能

Profile可以分析执行线程的状态和时间,还支持进一步选择ALL,CPU,MEMORY,BLOCK IO,CONTEXT SWITCHES等类型来查询SQL语句在不同系统资源上所消耗的时间。相关命令如下:

SHOW PROFILE [type [, type] ... ][FOR QUERY n][LIMIT row_count [OFFSET offset]]type参数:    ALL:显示所有开销信息    BLOCK IO:阻塞的输入输出次数    CONTEXT SWITCHES:上下文切换相关开销信息    CPU:显示CPU的相关开销信息     IPC:接收和发送消息的相关开销信息    MEMORY :显示内存相关的开销,目前无用    PAGE FAULTS :显示页面错误相关开销信息    SOURCE :列出相应操作对应的函数名及其在源码中的调用位置(行数)     SWAPS:显示swap交换次数的相关开销信息

通过 select @@have_profiling 查询数据库是否支持Show Profile功能(MySQL在5.0.37版本之后才支持该功能):

通过 select @@profiling 查询是否开启了该功能:

如果没有开启该功能可以设置profiling的值为1开启session级别的profiling:

set profiling = 1;

Show Profiles 只显示最近发给服务器的 SQL 语句,默认情况下是记录最近已执行的 15 条记录,我们可以重新设置 profiling_history_size 增大该存储记录,最大值为 100。

set profiling_history_size = 20;show variables like 'profiling_history_size'; 

通过show profiles命令可以拿到我们刚刚执行的SQL语句的Query_ID,我们可以再通过 show profile for query Query_ID语句就能查到对应的SQL语句在执行过程中线程的每个状态所消耗的时间了。

  • starting:开始
  • checking permissions:校验权限
  • Opening tables:打开表
  • init:初始化
  • System lock:系统锁定
  • optimizing:优化
  • statistics:统计
  • preparing:准备
  • executing:执行
  • Sending data:读取数据并返回给客户端
  • end:结束
  • query end:查询结束
  • closing tables:关闭表
  • freeing items:释放资源
  • cleaning up:清理

结束!

感谢您的浏览!

mysql sql优化_MySQL优化SQL语句的步骤相关推荐

  1. mysql sql优化_MySQL数据库SQL语句优化原理专题(三)

    需求 做过开发的同学,对分页肯定不会陌生,因为很多前台页面展示,为了更好的展示数据,就会用到分页,所以如何写一个高性能的分页SQL语句,是每一个开发人员需要掌握的技能. 分页SQL 这里给大家写一个分 ...

  2. mysql sql优化_Mysql的SQL优化指北

    要知道怎么优化首先要知道一条SQL是怎么被执行的 首先我们会连接到这个数据库上,这时候接待你的就是连接器.连接器负责跟客户端建立连接.获取权限.维持和管理连接. MySQL拿到一个查询请求后,会先到查 ...

  3. mysql慢日志优化_Mysql优化-慢sql日志

    一.开启慢sql日志捕获慢sql 1.查询mysql是否开启慢sql捕获:show variables like '%slow_query_log%'; 默认为OFF,开启:set global sl ...

  4. mysql数据库语言_mysql数据库sql语句基础知识

    1.数据库操作 查看当前数据库 SELECT DATABASE(); 显示用户名,数据库版本 SELECT user(), version(); 创建库 CREATE DATABASE[ IF NOT ...

  5. mysql字段优化_MySQL优化(1):字段的设计

    Web项目中,当Java或者Go等语言速度提升到瓶颈的时候,我们需要关心MySQL的优化 可以优化的方面有很多:设计表.负载均衡.读写分离.SQL语句优化等 (1)IP地址设计 例如我们需要存储IP地 ...

  6. mysql i优化_mysql优化 - ifeixiang的个人页面 - OSCHINA - 中文开源技术交流社区

    下面是一部分比较重要的建议: 1.选择正确的存储引擎 以 MySQL为例,包括有两个存储引擎 MyISAM 和 InnoDB,每个引擎都有利有弊. MyISAM 适合于一些需要大量查询的应用,但其对于 ...

  7. 有关mysql的清理与优化_mysql优化点整理

    优化sql一般步骤: 1.通过show (session 或者 global) status 来查看( 当前连接 或者 数据库上次开机以来 )的服务器状态信息,默认是session 例如: show ...

  8. mysql分页案例_MySQL优化案例系列-mysql分页优化

    通常,我们会采用ORDER BY LIMIT start, offset 的方式来进行分页查询.例如下面这个SQL: SELECT * FROM `t1` WHERE ftype=1 ORDER BY ...

  9. mysql优化1001mysql优化_mysql优化之基础规范

    优化包含建表规约.SQL 规约.索引规约三个部分,每部分的每一条都有强制.建议两个级别,大家在参考时,根据自己的情况来权衡. 建表规约 [强制]:①存储引擎必须使用 InnoDB 解读:InnoDB ...

  10. mysql查询表变量_MySQL 之SQL语言、表库操作、查询及变量精讲

    SQL语言 1. SQL语言组成部分 DDL:定义语言 (create.drop.alter) DML:操作语言 (insert.delete.update.select) DCL: 控制语言 (gr ...

最新文章

  1. 第九章 Oracle结构及数据库表与开发语言的对应关系、Oracle数据类型char与varchar
  2. 关于注册登陆时候进行的归档解档--严焕培
  3. 可配置的逻辑块(CLB)
  4. bottle模板中的替换
  5. 【NOIP 2017】宝藏
  6. 数据湖产业生态联盟简介
  7. windows下WDK创建免费的测试证书,并签名windows驱动文件(附带测试效果)
  8. 说说 XcodeGhost 这个事
  9. 【Java爬虫】接口模拟微信公众号登录,搜索公众号,获取公众号文章,java实现
  10. 电脑绣花制版软件评比(上)
  11. 【mac】一招帮你腾出mac的大量储存空间
  12. scikit-learn安装步骤
  13. 用python写生日快乐说说_祝自己生日快乐的说说
  14. ISCC2016Basic Writeup
  15. 利用Kmeans聚类进行用户分层分析
  16. html中outline属性,css的outline属性的作用是什么
  17. 角雷达进入“高速增长期”,国产供应商迎来“突围”时间窗口
  18. webstorm注册码 破解,长期有效
  19. 22届春季校招实习试水之路1(Java后端)
  20. element 表格内显示图片

热门文章

  1. 面试被问 Go 的map[int64]int64 在 redis 会占多少空间...
  2. Go语言操作MySQL的基础知识
  3. 解决方案:超卖(Redis原子队列)
  4. idea中查看maven信息
  5. mysql中常用的时间工具
  6. java 获取方法名
  7. 键盘事件与JS Filter
  8. PowerDesigner(三)-企业架构模型
  9. 使用static代码块实现线程安全的单例设计模式
  10. python学习中软件开发知识点_Python 学习知识点总结归纳