数据库 -> 对慢查询都怎么优化?

对慢查询都怎么优化?

检查慢日志是否开启

  • 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

猜你喜欢

转载自blog.csdn.net/rod0320/article/details/123492304