分析MySQL语句查询性能的方法除了使用 EXPLAIN 输出执行计划,还可以让MySQL记录下查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称为“慢查询”。
对于有效率问题的SQL语句(“慢查询”),MySQL通过慢查询日志进行监控。
SHOW VARIABLES LIKE ‘slow_query_log’;
查看慢查询日志是否开启:
SHOW VARIABLES LIKE ‘%log%’;
查看关于日志的所有属性:
SET GLOBAL log_queries_not_using_indexes = ON;
设置全局变量,没用到索引的查询也要记录:
SHOW VARIABLES LIKE ‘long_query_time’;
查看超过多长时间的查询会被记录到慢查询日志中:
SET GLOBAL slow_query_log = ON;
开启慢查询日志:
SET GLOBAL long_query_time = 0;
设置慢查询日志记录时间为0秒,即全部查询都记录:
SHOW VARIABLES LIKE ‘slow%’;
查看慢查询日志所在位置:
查看全局变量是否设置成功(新开一个客户端):
查看慢查询日志内容:
# Time: 160715 15:00:30
# User@Host: root[root] @ localhost [127.0.0.1] Id: 1
# Query_time: 0.000000 Lock_time: 0.000000 Rows_sent: 109 Rows_examined: 109
use sakila;
SET timestamp=1468566030;
SELECT * FROM country;
分析:
查询用户为:root[root] @ localhost [127.0.0.1](User@Host)
查询花费时间:0.000000秒(Query_time)
锁定时间:0.000000秒(Lock_time)
返回记录行数:109(Rows_sent)
检索行数:109(Rows_examined)
查询语句:SELECT * FROM country;
总结:
慢查询日志实时记录查询的相关信息,有利于及时发现开发过程中效率低下的SQL语句,及时进行优化!
磁盘IO相关:
- Rows_examined代表检索的行数,其值一定程度上与磁盘的IO程度有关。IO即读写。试想,如果某个SQL操作需要(联合)查询的行数Rows_examined很大很大(从磁盘中读出数据至MySQL服务器内存中进行SQL条件判断),意味着磁盘的读出操作比较繁忙,IO程度大。
- 若磁盘IO过大,很容易形成IO阻塞,导致系统瓶颈。数据库文件存储在硬盘中,硬盘的读写速度远远落后于CPU与内存(硬盘是磁盘的一种,磁盘还包括软盘,磁盘是通过磁性进行读写功能的设备,断电后保存的文件不会丢失。内存也可以储存信息,但存储的载体和磁盘不同,断电后就不能保存数据。)
- 内存是电脑的数据存储设备之一,其特点为容量较小,但数据传送速度较快,用以弥补硬盘虽然容量大但传送速度慢的缺点。在电脑中,内存被架设在硬盘和高速缓存器(容量比内存更小同时速度比内存更快的存储器,架设在内存和CPU之间)之间,从而可以充分发挥CPU的运算能力,不至于使CPU的高速运算能力因数据提取速度过慢而浪费,所以,电脑的运行速度是由CPU,高速缓存器以及内存等存储设备共同决定的。
- 硬盘是电脑中用来存放暂时不用的信息(包括系统文件)的数据存储设备,特点是存储容量大,但数据传送速度慢。硬盘上的信息永远是暂时不用的,如果用,要先装入内存!