1 前言
在应用的开发过程中,由于开发初期的数据量一般都比较小,所以开发过程中一般都比较注重功能上的实现,但是当完成了一个应用或者系统之后,随着生产数据量的急剧增长,那么之前的很多sql语句的写法就会显现出一定的性能问题,对生产的影响也会越来越大,这些不恰当的sql语句就会成为整个系统性能的瓶颈,为了追求系统的极致性能,必须要对它们进行优化。
这篇文章开始后面的几篇文章将结合自己平时工作和学习中的知识记录下,当面对一个有sql性能问题的数据库时,我们应该从何处入手来进行系统的分析,使得能够尽快定位问题、解决问题。
2 正文
上一篇文章:几个必须掌握的SQL优化技巧(一):查看SQL语句的执行频率介绍了如何通过两个命令来查询SQL的执行频率。这两个命令分别是:
show[session|global] status 复制代码
和
show global status like 'Innodb_rows_%' 复制代码
今天这篇文章将介绍如何定位到低效率的执行SQL。
通常可以通过以下两种方式来定位到执行效率比较低的SQL语句。
1、慢查询日志:慢查询指的是我们自己可以设定一定的标准,如果执行sql语句的效率低于这个标准,那么就算慢查询并被记录在慢查询日志中,这个功能需要开启才能用。通过慢查询日志定位那些执行效率较低的SQL语句,用
log-slow-queries[=file_name] 复制代码
选项启动时,mysqld写一个包含所以执行时间超过long_query_time秒的sql语句的日志文件。
在MySQL的配置文件my.cnf中写上:
# 慢查询的定义时间,这里是2秒 long_query_time = 2 # 慢查询日志的位置 log-slow-queries = /var/lib/mysql/mysql-slow.log 复制代码
long_query_time是指执行超过多久的SQL会被日志记录下来,这里是2 秒。
log-slow-queries设置把日志写在那里,上面则表示慢查询日志会写到文件/var/lib/mysql/mysql-slow.log中,当为空的时候,系统会给慢查询日志赋予主机名,并加上slow.log。如果设置了参数log-long-format ,那么所有没有使用索引的查询也将被记录。
除了上面的通过修改配置文件 的方式开启慢日志查看还可以通过mysql数据库的方式开始慢查询日志:
set global slow_query_log=ON set global long_query_time = 3600 set global log_querise_not_using_indexes =ON 复制代码
这是一个非常有用的日志。它对于性能的影响不大(假设所有查询都很快),并且强调了那些最需要注意的查询(丢失了索引或索引没有得到最佳应用)。
2、show processlist命令:慢查询日志在查询结束后才记录,所以在应用反映执行效率出现问题的时候查询慢查询日志并不能定位问题,可以通过使用show processlist命令查看当前mysql在进行的线程,包括线程的状态、是否锁表等,可以实时地查看sql的执行情况,同时对一些锁表操作进行优化。
可以看到id=13的表示正在执行刚刚的show processlist。
通过show processlist命令查询结果的字段的含义分别是:
1、id:用户登录mysql时,系统分配的“Connection_id”,可以使用函数connection_id()函数进行查看;
2、User:显示当前用户。如果不是root,这个命令就只显示用户权限范围的sql语句;
3、Host:显示这个语句是从哪个ip的哪个端口上发出的,可以同来跟踪出现问题语句的用户;
4、db:显示这个进行当前链接的数据;
5、command:显示当前链接执行的命令,一般取值为sleep、query、connect等;
6、time:显示这个状态持续的时间,单位是秒;
7、state:显示当前连接的sql语句的状态,很重要的列,state描述的是语句执行的某一个状态,一个sql语句,以查询为例,可能需要经过copying to tmp table、sorting result、sending data等状态才可以完成;
8、info:显示这个sql语句,是判断问题语句的一个重要依据
3 总结
通过上述的两种方式:慢查询日志和show processlist命令,可以定位到执行效率比较低的sql语句,后续可以针对这些执行效率比较低的sql语句进行sql优化,这个将在后面进行介绍。
后面将会继续分享关于sql优化的其他方法、步骤。