1.优化SQL步骤(3个)
1.通过SHOW STATUS命令来了解各种SQL的执行频率
SHOW STATUS命令可以查看服务器的状态信息,通过"LIKE" 参数定位信息。如下图:
区别:
SHOW STATUS 为当前session级别的;
SHOW GLOBAL STATUS 为全局级别;
简要介绍展示的参数:
以下参数在MyIsam和Innodb 存储引擎中都会计数:
- Com_select 显示执行 select 操作的次数,一次查询只累加 1 ;
- Com_insert 执行 insert 操作的次数,对于批量插入的 insert 操作,只累加一次 ;
- Com_update 执行 update 操作的次数;
- Com_delete 执行 delete 操作的次数;
以下几个参数是针对 Innodb 存储引擎计数的,累加的算法也略有不同:
- Innodb_rows_read select 查询返回的行数;
- Innodb_rows_inserted 执行 Insert 操作插入的行数;
- Innodb_rows_updated 执行 update 操作更新的行数;
- Innodb_rows_deleted 执行 delete 操作删除的行数;
以下几个参数便于我们了解数据库的基本情况:
- Connections 试图连接 Mysql 服务器的次数;
- Uptime 服务器工作时间
- Slow_queries 慢查询的次数
2.定位执行效率较低的SQL语句
可以通过下面两种方式定位执行效率低下的SQL语句:
- 通过慢查询日志定位那些执行效率较低的 sql 语句,编辑/etc/my.cnf文件(Linux上若没有该文件,则复制一个/usr/share/mysql目录下的.cnf文件到/etc目录,并改名为my.cnf即可,或是新增该文件)用 –log-slow-queries[=file_name] 选项启动时, mysqld 写一个包含所有执行时间超过long_query_time 秒的 SQL 语句的日志文件。可以链接到管理维护中的相关章节。
- 使用 show processlist查看当前MYSQL的线程, 命令慢查询日志在查询结束以后才纪录,所以在应用反映执行效率出现问题的时候查 询慢查询日志并不能定位问题,可以使用 show processlist 命令查看当前 MySQL 在进行的线程,包括线程的状态,是否锁表等等,可以实时的查看 SQL 执行情况, 同时对一些锁表操作进行优化。如下图所示:
3. 通过EXPLAIN 分析低效 SQL的执行计划:
通过以上步骤查询到效率低的 SQL 后,我们可以通过 explain 或者 desc 获取MySQL 如何执行 SELECT 语句的信息,包括 select 语句执行过程表如何连接和连接 的次序。如下图所示:
参考文档:https://blog.csdn.net/hguisu/article/details/5731629#comments (在文章的基础上做了补充)