MySQL 的性能(上篇)—— SQL 执行分析
简介
文中内容均为阅读前辈的文章所整理而来,参考文章已在最后全指明
本文分为上下两篇:
- 上篇:MySQL 的 SQL 执行分析
- 下篇:MySQL 性能优化
后端开发必然会接触到数据库,数据层的优劣会影响整个服务的响应时间。所以,数据库的优化技巧是必须掌握的,下面就是我在学习过程中整理的,备忘。
下面为上篇内容,分为以下部分:
- 一、SQL 执行时间分析
- 二、SQL 执行情况分析
一、SQL 执行时间分析
通过找到执行时间长的 SQL 语句,可以直观的发现数据层的效率问题。
1.通过 show processlist 来查看系统的执行情况
mysql> show processlist;
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+------+---------+------+-------+------------------+
| 2 | root | localhost | NULL | Query | 0 | init | show processlist |
+----+------+-----------+------+---------+------+-------+------------------+
1 row in set (0.01 sec)
2.通过 profiling 来进行查看
这个命令是查看 SQL 的执行时间,能很直观的看出快慢。
2.1 查看 profiling 是否开启
0 代表还是关闭着分析功能
mysql> select @@profiling;
+-------------+
| @@profiling |
+-------------+
| 0 |
+-------------+
2.2 打开工具
mysql> set profiling=1;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> select @@profiling;
+-------------+
| @@profiling |
+-------------+
| 1 |
+-------------+
2.3 查看 SQL 的执行时间
mysql> show profiles;
+----------+------------+----------------------------+
| Query_ID | Duration | Query |
+----------+------------+----------------------------+
| 1 | 0.00173700 | select * from ip |
| 2 | 0.00057500 | select porxy, port from ip |
+----------+------------+----------------------------+
2.4 查看 SQL 执行耗时详细信息
语法:show profile for query Query_ID
mysql> show profile for query 1;
+----------------------+----------+
| Status | Duration |
+----------------------+----------+
| starting | 0.000073 |
| checking permissions | 0.000031 | ---检查是否在缓存中
| Opening tables | 0.000207 | ---打开表
| init | 0.000067 | ---初始化
| System lock | 0.000040 | ---锁系统
| optimizing | 0.000005 | ---优化查询
| statistics | 0.000021 |
| preparing | 0.000015 | ---准备
| executing | 0.000003 | ---执行
| Sending data | 0.000993 |
| end | 0.000006 |
| query end | 0.000007 |
| closing tables | 0.000011 |
| freeing items | 0.000169 |
| cleaning up | 0.000089 |
+----------------------+----------+
以上具体的信息都是从 INFORMATION_SCHEMA.PROFILING 这张表中取得的。这张表记录了所有的各个步骤的执行时间及相关信息。语法:
select * from INFORMATION_SCHEMA.PROFILING where query_id = Query_ID;
3.慢查询日志
MySQL 的慢查询日志,顾名思义就是把执行时间超过设定值(默认为10s)的 SQL 记录到日志中。这项功能需要手动开启,但是开启后会造成一定的性能损耗。
3.1 查看慢日志是否开启
默认情况下slow_query_log的值为OFF,表示慢查询日志是禁用的,可以通过设置slow_query_log的值来开启。语法:set global slow_query_log=1
mysql> show variables like '%slow_query_log%';
+---------------------+------------------------------------------------------+
| Variable_name | Value |
+---------------------+------------------------------------------------------+
| slow_query_log | OFF |
| slow_query_log_file | /usr/local/var/mysql/xueweihandeMacBook-Air-slow.log |
+---------------------+------------------------------------------------------+
2 rows in set (0.11 sec)
mysql> set global slow_query_log=1;
Query OK, 0 rows affected (0.03 sec)
mysql> show variables like '%slow_query_log%';
+---------------------+------------------------------------------------------+
| Variable_name | Value |
+---------------------+------------------------------------------------------+
| slow_query_log | ON |
| slow_query_log_file | /usr/local/var/mysql/xueweihandeMacBook-Air-slow.log |
+---------------------+------------------------------------------------------+
3.2 设置超时时间
- 设置语法:
set global long_query_time=4 - 查看语法:
show variables like 'long_query_time'
注意:修改后,需要重新连接或新开一个会话才能看到修改值。
永久生效,修改 my.cnf
slow_query_log=1
long_query_time=10
slow_query_log_file=/path/mysql_slow.log
3.3 其他参数
3.3.1 log_output
参数是指定日志的存储方式。log_output='FILE'表示将日志存入文件,默认值是'FILE'。log_output='TABLE'表示将日志存入数据库,这样日志信息就会被写入到mysql.slow_log表中。MySQL数据库支持同时两种日志存储方式,配置的时候以逗号隔开即可,如:log_output='FILE,TABLE'。日志记录到系统的专用日志表中,要比记录到文件耗费更多的系统资源,因此对于需要启用慢查询日志,又需要能够获得更高的系统性能,那么建议优先记录到文件。
3.3.2 log-queries-not-using-indexes
未使用索引的查询也被记录到慢查询日志中(可选项)。如果调优的话,建议开启这个选项。另外,开启了这个参数,其实使用full index scan的sql也会被记录到慢查询日志。
3.3.3 log_slow_admin_statements
表示是否将慢管理语句例如ANALYZE TABLE和ALTER TABLE等记入慢查询日志
3.4 分析工具 mysqldumpslow
MySQL 提供了慢日志分析工具 mysqldumpslow。
-s表示按照何种方式排序;- c: 访问计数
- l: 锁定时间
- r: 返回记录
- t: 查询时间
- al:平均锁定时间
- ar:平均返回记录数
- at:平均查询时间
-t是top n的意思,即为返回前面多少条的数据;-g后边可以写一个正则匹配模式,大小写不敏感的;
3.4.1 命令示例
得到返回记录集最多的 10 个 SQL:
mysqldumpslow -s r -t 10 /database/mysql/mysql06_slow.log得到访问次数最多的 10 个 SQL:
mysqldumpslow -s c -t 10 /database/mysql/mysql06_slow.log得到按照时间排序的前10条里面含有左连接的查询语句:
mysqldumpslow -s t -t 10 -g “left join” /database/mysql/mysql06_slow.log另外建议在使用这些命令时结合 | 和 more 使用 ,否则有可能出现刷屏的情况:
mysqldumpslow -s r -t 20 /mysqldata/mysql/mysql06-slow.log | more
二、SQL 执行情况分析
使用 explain 分析 SQL 执行情况。
explain select * from ip;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| 1 | SIMPLE | ip | ALL | NULL | NULL | NULL | NULL | 400 | NULL |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| select_type | table | type | possible_keys | key | key_len | rows | Extra |
|---|---|---|---|---|---|---|---|
| 表示查询的类型 | 输出结果集的表 | 表示表的连接类型 | 表示查询时,可能使用的索引 | 表示实际使用的索引 | 索引字段的长度 | 扫描出的行数(估算的行数) | 执行情况的描述和说明 |
参考
MySQL 的性能(上篇)—— SQL 执行分析的更多相关文章
- mysql数据库SQL执行分析,优化前必备分析
概述 一般我们在对mysql数据库做优化,肯定需要对慢sql去做分析才能开始优化,那么有什么分析的方法呢?下面通过对sql执行时间和执行情况来做分析. 一.SQL 执行时间分析 通过找到执行时间长的 ...
- 【MySQL】MySQL中where条件的执行分析
1.问题描述 一条SQL,在数据库中是如何执行的呢?相信很多人都会对这个问题比较感兴趣.当然,要完整描述一条SQL在数据库中的生命周期,这是一个非常巨大的问题,涵盖了SQL的词法解析.语法解析.权限检 ...
- SQL监控:mysql及mssql数据库SQL执行过程监控审计
转载 Seay_法师 最近生活有很大的一个变动,所以博客也搁置了很长一段时间没写,好像写博客已经成了习惯,搁置一段时间就有那么点危机感,心里总觉得不自在.所以从今天起还是要继续拾起墨笔(键盘),继续好 ...
- SpringBoot整合MybatisPlus3.X之SQL执行分析插件(十四)
pom.xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId& ...
- MySQL 的性能(上篇)—— SQL 执行时间分析
简介 文中内容均为阅读前辈的文章所整理而来,参考文章已在最后全指明 本文分为上下两篇: 上篇:MySQL 的 SQL 执行时间分析 下篇:MySQL 性能优化 后端开发必然会接触到数据库,数据层的优劣 ...
- MySQL 的性能(下篇)—— 性能优化方法
简介 文中内容均为阅读前辈的文章所整理而来,参考文章已在最后全指明 本文分为上下两篇: 上篇:MySQL 的 SQL 执行分析 下篇:MySQL 性能优化 下面为下篇内容,分为以下部分: 一.创建表时 ...
- 软件性能测试技术树(三)----数据库(MySQL)性能
全图: MySQL重点监控指标: MySQL主流分支: 数据库架构设计: MySQL慢查询: SQL语句分析与调优: MySQL索引: MySQL存储引擎: MySQL实时监控: MySQL集群监控工 ...
- MP实战系列(十五)之执行分析插件
SQL 执行分析拦截器[ 目前只支持 MYSQL-5.6.3 以上版本 ],作用是分析 处理 DELETE UPDATE 语句, 防止小白或者恶意 delete update 全表操作! 这里我引用M ...
- mysql优化(三)–explain分析sql语句执行效率
mysql优化(三)–explain分析sql语句执行效率 mushu 发布于 11个月前 (06-04) 分类:Mysql 阅读(651) 评论(0) Explain命令在解决数据库性能上是第一推荐 ...
随机推荐
- C#WebApi 接口参数不再困惑:传参详解
前言:还记得刚使用WebApi那会儿,被它的传参机制折腾了好久,查阅了半天资料.如今,使用WebApi也有段时间了,今天就记录下API接口传参的一些方式方法,算是一个笔记,也希望能帮初学者少走弯路.本 ...
- SetParameter错误:java.time.Instant cannot be resolved
SetParameter Hibernate使用SetParameter错误 List<Customer> list = session.createQuery(hql).setParam ...
- 光纤网卡与HBA卡区别
1.简介 光纤网卡 ,指的是光纤以太网适配器,简称光纤网卡,学名Fiber Ethernet Adapter.传输输的是以太网通信协议,一般通过光纤线缆与光纤以太网交换机连接.按传输速率可以分为100 ...
- 发现Chrome 浏览器 JavaScript Date对象的几个Bug
打开浏览器F12 Console 输入: 第一个 位数影响 new Date("2018-06-9") Sat Jun 09 2018 00:00:00 GMT+0800 (中国标 ...
- 基于.net的Socket异步编程总结
最近在为公司的分布式服务框架做支持异步调用的开发,这种新特性的上线需要进行各种严格的测试.在并发性能测试时,性能一直非常差,而且非常的不稳定.经过不断的分析调优,发现Socket通信和多线程异步回调存 ...
- angular.isUndefined()
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 转 c#性能优化秘密
原文:http://www.dotnetperls.com/optimization Generally, using the simplest features of the language pr ...
- spring-cloud-Zuul学习(二)【基础篇】--典型配置【重新定义spring cloud实践】
-- 2019-04-15 20:22:34 引言 上一节是一个最基本的zuul网关实例,它是整个spring-cloud生态里面“路由-服务”的一个缩影,后续也就是锦上添花.这节主要讲述zuul的一 ...
- Java后台使用Websocket教程
在开发一个项目的时候使用到了WebSocket协议 什么是WebSocket? WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在WebSocket A ...
- [Codeforces Round #516][Codeforces 1063C/1064E. Dwarves, Hats and Extrasensory Abilities]
题目链接:1063C - Dwarves, Hats and Extrasensory Abilities/1064E - Dwarves, Hats and Extrasensory Abiliti ...