Mysql优化---常见优化方法和慢查询排查

8.一些其他的优化方法

(1)exist 和 in

    select ..from table where exist (子查询)

    select ..from table where 字段 in (子查询)
  • 如果主查询的数据集大,则使用in

  • 如果子查询的数据集大,则使用exist

    exist语法:将主查询的结果放到子查询中进行条件校验,看是否有数据,如果有数据,则校验成功,如果复合校验,则保留数据;

    (2)order by 优化

    using filesort 有两种算法:双路排序、单路排序(根据IO的次数)

    注意:表最终是以文件形式保存在磁盘中

    MySQL4.1之前 默认使用 双路排序; 扫描磁盘两次 (1. 从磁盘读取排序字段,对排序字段进行排序(在buffer中进行排序)2. 扫描其他字段)—IO较消耗性能

    MySQL4.1之后 默认使用 单路排序:只读取一次(全部字段),在buffer中进行排序。但这种单路排序会有一定的隐患(不一定会是单路(IO),可能多次IO操作)。如果数据量大的话,无法将数据全部读入缓冲区,因此需要分片读取,多次IO。

    注意:单路排序比多路排序会多占用buffer, 因此可以调整buffer容量。

    提高order by查询的策略:

    • 选择使用单路、双路:调整buffer的容量大小;
      比如:set max_length_for_sort_data = 1200
    • 避免select * …
    • 复合索引,不要跨列使用。避免using filesort
    • 保证全部的排序字段 排序的一致性(都是升序或者降序)

  1. SQL排序 - 慢查询日志:MySQL提供的一种日志记录,用于记录MySQL响应时间超过阈值的SQL语句(long_queue_time, 默认10秒)
    慢查询日志默认是关闭的,建议:开发调优是关闭的,而最终部署是关闭的。

检查是否开启了慢查询日志:

  show variables like "%slow_query_log%";

临时开启:

   set global slow_query_log = 1; --在内存中开启`
   
   exit
   
   service mysql restart

永久开启:

  /etc/my.cnf 中追加配置
   vi /etc/my.cnf
   [mysqld]
   slow_query_log = 1
   slow_query_log_file = /var/lib/mysql/localhost-slow.log

慢查询阈值:

show variables like '%long_query_time%';

临时设置阈值:

set global long_query_time = 5; --设置完毕后,重新登录后起效(不需要重启服务)

永久设置阈值:

/etc/my.cnf 中追加配置
vi /etc/my.cnf
[mysqld]
long_query_time=3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值