zoukankan      html  css  js  c++  java
  • (八)查询截取分析

    分析流程:
    1.观察一定周期,看看生产的慢SQL情况
    2.开启慢查询日志,设置阈值,比如超过5秒钟就是慢SQL,并将它抓取出来
    3.explain+慢SQL分析
    4.show profile
    5.进行SQL数据库服务器的参数调优
    总结下来就是:
    1.慢查询的开启并捕获
    2.explain+慢SQL分析
    3.show profile查询SQL在MySQL服务器里面的执行细节和生命周期情况
    4.SQL数据库服务器的参数调优

    1.查询优化

    1.1 永远小表驱动大表


    1.2 order by关键字的优化

    order by子句中,尽量使用Index方式排序,避免使用FileSort方式排序
    尽可能的在索引列上完成排序操作,遵照索引键的最佳左前缀原则
    建表:

    create table tblA{
      age int,
      birth timestamp 
      
    }
    
    create index idx_a_ageBirth on tbla(age,birth)
    
    

    1.3 如果不在索引列上,filesort有两种算法(mysql就要启动双路排序和单路排序):

    • 双路排序:MySQL4.1之前是使用双路排序,字面意思就是两次扫描磁盘,最终得到数据,读取行指针和orderby列,对他们进行排序,然后扫描已经排好的列表。从磁盘取排序字段,在buffer进行排序,再从磁盘取其他字段。
    • 单路排序:从磁盘读取查询需要的所有列,按照orderby列再buffer对它们进行排序,然后扫描排序后的列表进行输出,它的效率更快一些,避免了第二次读取数据。并且把随机IO变成。
    • 结论及引申出的问题:
      • 由于单路是后出的,总体而言好过双路
      • 但是用单路有问题(本来想省一次IO操作,反而导致了大量的IO操作,反而得不偿失)

    1.4 优化策略

    • 增大sort_buffer_size参数的设置
    • 增大max_length_for_sort_data参数设置
      提高order by查询速度

    1.5 group by关键字优化

    • groupby实质是先排序后进行分组,遵循索引键的最佳左前缀
    • 当无法使用索引列,增大max_length_for_sort_data参数的设置+增大sort_buffer_size参数的设置
    • where高于having,能写在where限定的条件就不要去having限定了。

    1.6 为排序使用索引总结

    2.慢查询日志分析

    • MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阙值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。
    • 具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10秒以上的语句。
    • 由他来查看哪些SQL超出了我们的最大忍耐时间值,比如一条sql执行超过5秒,我们就算慢sql,希望能收集超过5秒的sql,结合之前的explain进行全面分析。

    2.1 说明:

    默认情况下Mysql数据库没有开启慢查询日志,需要我们手动来设置这个参数。
    当然,如果不是调优的需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影像。慢查询日志支持将日志记录写入文件。

    2.1 查看是否开启及如何开启

    • 默认:SHOW VARIABLES LIKE '%slow_query_log%';
    • 开启:set global slow_query_log=1;
    • 永久生效

      关于慢查询的参数slow_query_log_file,它指定慢查询日志文件的存放路径,系统默认会给一个缺省的文件host_name-show.log(如果没有指定参数slow_query_log_file的话)

    2.2 开启了慢查询日志后,什么样的SQL才会记录到慢查询日志里面呢?

    • 这个是由参数long_query_time控制,默认情况下long_query_time的值为10秒
    • 命令:SHOW VARIABLES LIKE '%long_query_time%'
    • 可以使用命令修改,也可以在my.cnf参数里面修改
    • 假如运行时间正好等于long_query_time的情况,并不会被记录下来。也就是说,在mysql源码里是判断大于long_query_time,而非大于等于。
  • 相关阅读:
    stm32之watchdog
    stm32之PWM
    stm32之GPIO(二)
    JavaScript之怎样获取元素节点
    JavaScript之对象学习
    JavaScript之数组学习
    Jquery遍历数组之$.inArray()方法介绍
    Jquery 遍历数组之$().each方法与$.each()方法介绍
    C# 移位运算符
    tensorboard简单使用
  • 原文地址:https://www.cnblogs.com/everyingo/p/14120276.html
Copyright © 2011-2022 走看看