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

对慢查询都怎么优化?

检查慢日志是否开启

  • 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值