如何分析“慢查询”日志进行 SQL/索引 优化?

548 阅读2分钟

在日常开发当中,经常会遇到页面打开速度极慢的情况,通过排除,确定了,是数据库的影响,为了迅速查找具体的SQL,可以通过Mysql的日志记录方法

性能瓶颈定位

* Show命令
* 慢查询日志
* explain分析查询
* profiling分析查询

开启慢查询日志

在配置文件`my.cnf`或`my.ini`中在 [mysqld] 一行下面加入配置参数
log_output='TABLE'								// 输出到表
log=ON										// 开启日志记录
log_slow_queries=ON 							// 打开慢查询sql记录slow_log
log-slow-queries=/data/mysqldata/slow-query.log          // 慢查询日志存放的位置        
long_query_time=2 							// 表示查询超过两秒才记录;                     
log-queries-not-using-indexes  					// 表示记录下没有使用索引的查询

SQL/索引优化

(1)  越小的数据类型通常更好:越小的数据类型通常在磁盘、内存和CPU缓存中都需要更少的空间,处理起来更快。 
(2)  简单的数据类型更好。内置的日期和时间数据类型代替字符串来存储时间整型数据类型代替字符串来存储IP地址
(3)  尽量避免NULL:应该指定列为NOTNULL,除非你想存储NULL。0|一个特殊的值|一个空串代替NULL

查询sql执行记录

-- 执行成功的:慢查询语句,和未使用索引的语句
select * from mysql.slow_log order by 1; 
-- 所有语句: 成功和未成功的
select * from mysql.general_log order by 1; 

long_query_time参数说明

 v4.0, 4.1, 5.0, v5.1 到 5.1.20(包括) 
 不支持毫秒级别的慢查询分析(支持精度为1-10秒)
 5.1.21及以后版本
 支持毫秒级别的慢查询分析, 如0.1
 6.0 到 6.0.3
 不支持毫秒级别的慢查询分析(支持精度为1-10秒)
 4. 6.0.4及以后
 支持毫秒级别的慢查询分析

通过日志中记录的SQL,迅速定位到具体的数据库表和SQL语句,优化SQL后,查看速度是否有提升