对慢查询都怎么优化?
检查慢日志是否开启
SHOW VARIABLES LIKE '%slow%';
- 开启慢查询日志
方法一: 临时有效
/* 开启慢日志 */
mysql> set global slow_query_log=on;
Query OK, 0 rows affected (0.08 sec)
/* 设置慢查询时间阈值 -> sql查询数据超过了就打印日志 */
mysql> set global long_query_time=3600;
Query OK, 0 rows affected (0.08 sec)
/* 设置控制是否记录未走索引的 SQL 查询 */
mysql> set global log_queries_not_using_indexes=on;
Query OK, 0 rows affected (0.00 sec)
方法二: 永久有效
/* 修改配置文件 在 my.ini 增加几行 */
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/var/localhost-slow.log
long_query_time=0
log-queries-not-using-indexes = 1
// 配置好后,重启mysql服务
- 检查对应慢日志
show variables like '%quer%'; /* slow_query_log_file对应的就是日志文件路径 */
- 看一下是那一条sql慢了
- 使用
explain SELECT * FROM 表;
解析一下sql
SQL语句来看
- 无索引、索引失效导致慢查询
- 如果表很大,而对where或者order by 后面字段没有建立索引,那这种情况查起来肯定很费力。
- 索引还有可能会失效,所以索引失效也是导致慢查询的主要原因之一。
- 索引失效基本就是我们的sql语句的问题了
- 例如模糊查询%在前、查询的字段使用了函数、做了计算操作、类型转换、联表查询字符格式不一样都有可能导致索引失效
- 不恰当的 SQL 语句
SELECT *
- 非索引字段进行排序
LIMIT 66660,10;
- 第一次查询完成后第二次又找出66670个数据,并且去掉前66660个,会慢查询
- 我们可以用where条件第一次查询完成就去掉前66660个直接
LIMIT 10