简介

文中内容均为阅读前辈的文章所整理而来,参考文章已在最后全指明

本文分为上下两篇:

后端开发必然会接触到数据库,数据层的优劣会影响整个服务的响应时间。所以,数据库的优化技巧是必须掌握的,下面就是我在学习过程中整理的,备忘。

下面为上篇内容,分为以下部分:

  • 一、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 执行时间分析的更多相关文章

  1. MySQL 的性能(上篇)—— SQL 执行分析

    简介 文中内容均为阅读前辈的文章所整理而来,参考文章已在最后全指明 本文分为上下两篇: 上篇:MySQL 的 SQL 执行分析 下篇:MySQL 性能优化 后端开发必然会接触到数据库,数据层的优劣会影 ...

  2. mysql数据库SQL执行分析,优化前必备分析

    概述 一般我们在对mysql数据库做优化,肯定需要对慢sql去做分析才能开始优化,那么有什么分析的方法呢?下面通过对sql执行时间和执行情况来做分析. 一.SQL 执行时间分析 通过找到执行时间长的 ...

  3. 软件性能测试技术树(三)----数据库(MySQL)性能

    全图: MySQL重点监控指标: MySQL主流分支: 数据库架构设计: MySQL慢查询: SQL语句分析与调优: MySQL索引: MySQL存储引擎: MySQL实时监控: MySQL集群监控工 ...

  4. MySQL SQL语句分析查询优化

    如何获取有性能问题的SQL 1.通过用户反馈获取存在性能问题的SQL 2.通过慢查询日志获取性能问题的SQL 3.实时获取存在性能问题的SQL 使用慢查询日志获取有性能问题的SQL 首先介绍下慢查询相 ...

  5. 使用systemtap调试工具分析MySQL的性能

    [工具] SystemTap是Linux下的动态跟踪工具,可以方便的监控.跟踪运行中的程序或Linux内核操作,我们通过写SystemTap脚本(与C语言类似),编译为内核模块,然后加载到内核中运行, ...

  6. MySQL 索引性能分析概要

    上一篇文章 MySQL 索引设计概要 介绍了影响索引设计的几大因素,包括过滤因子.索引片的宽窄与大小以及匹配列和过滤列.在文章的后半部分介绍了 数据库索引设计与优化 一书中,理想的三星索引的设计流程和 ...

  7. mysql性能优化-慢查询分析、优化索引和配置

    一.优化概述 二.查询与索引优化分析 1性能瓶颈定位 Show命令 慢查询日志 explain分析查询 profiling分析查询 2索引及查询优化 三.配置优化 1)      max_connec ...

  8. mysql数据库性能优化(包括SQL,表结构,索引,缓存)

    优化目标减少 IO 次数IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当 ...

  9. mysql优化(三)–explain分析sql语句执行效率

    mysql优化(三)–explain分析sql语句执行效率 mushu 发布于 11个月前 (06-04) 分类:Mysql 阅读(651) 评论(0) Explain命令在解决数据库性能上是第一推荐 ...

随机推荐

  1. 机器学习:Python实现最小均方算法(lms)

    lms算法跟Rosenblatt感知器相比,主要区别就是权值修正方法不一样.lms采用的是批量修正算法,Rosenblatt感知器使用的 是单样本修正算法.两种算法都是单层感知器,也只适用于线性可分的 ...

  2. input 点击链接事件

  3. Confluence安装&破解&汉化

    p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; f ...

  4. SPOJ - BITDIFF: Bit Difference [神妙の预处理]

    tags:[数学][预处理]题解:我们用一种巧妙的预处理姿势:记录下每一个数位上分别出现了多少个1.如果第i个数位上出现了cnt[i]个1,那么,在这个数位上产生的"差异值"为:2 ...

  5. 老李分享:jvm结构简介 2

    2.2.4 Program counter regsiters:程序计数器 类似于PC寄存器,是一块较小的内存区域,通过程序计数器中的值寻找要执行的指令的字节码,由于多线程间切换时要恢复每一个线程的当 ...

  6. Centos7多网卡绑定操作,通过nmcli命令操作。

    运行 ip link 命令查看系统中可用的接口1.创建bond网卡nmcli con add type team con-name team0 ifname team0 config '{" ...

  7. ThinkPHP框架前后台的分页调用

    一般ThinkPHP框架在底层给开发者提供了一个基本的分页类Page.class.php里面规定了Page类的一些基本的参数和结构. 2.应用分页 1> 调取文件use Think\Page; ...

  8. LINUX ON AZURE 安全建议(全)

    本文为个人原创,可以自由转载,转载请注明出处,多谢! 本文地址:http://www.cnblogs.com/taosha/p/6399554.html 1.网络与安全规划 Azure 虚拟网络 (V ...

  9. IntelliJ IDEA应用[一]下载与安装

    一.IntelliJ IDEA 12.1.6的下载 IntelliJ IDEA的官方下载网站:http://www.jetbrains.com/idea/download/

  10. 人生第一次hash

    人生的第一次hash交给了模板题. 讲道理,还没有别人快排要快,就比暴力快那么一点... 难道我写的hash就那么菜么? 我想了想,光是处理字符串就O(n*len).. 这是hash的正确写法吗?我都 ...