查询截取分析

查询截取分析
  1. 分析步骤

    1. 观察,至少跑一天,看看生产的慢sql情况

    2. 开启慢查询日志,设置阈值,比如超过5秒钟的就是慢sql,并将它抓取出来

    3. explain + 慢sql分析

    4. show profile

    5. 以上4步完还不行,就需要运维经理或者DBA进行参数调优

  2. 总结

    1. 慢查询的开启并捕获

    2. explain + 慢sql分析

    3. show profile查询SQL在Mysql服务器里面执行细节和生命周期情况

    4. SQl数据库服务的参数调优

  3. 查询优化

    1. 永远小表驱动大表类似嵌套循环Nested Loop,即小的数据集驱动大的数据集

    2. order by 优化

      1. order by子句,尽量使用index方式排序,避免使用FileSort方式排序,尽可能在索引列上完成排序操作,遵循索引建立的最佳左前缀

        1. Mysql支持两种方式的排序,filesort和index,Index效率高,它指Mysql扫描所以本身完成排除。Filesort效率较低

        2. order by 满足两种情况会使用Index方式排序

          1. order by语句使用索引最左前列

          2. 使用where子句与order by子句条件列组合满足索引最左前列

      2. 如果不在索引列上,filesort有以下两种算法

        1. 双路排序:Mysql4.1之前是使用双路排序,字面意思就是两次扫描磁盘,最终得到数据,读取行指针和order by 列,对他们进行排序,然后扫描已经排好序的列表,按照列表中的值重新从列表中读取对应的数据输出

        2. 单路排序:从磁盘读取查询需要的所有列,按照order by列在buffer对他们进行排序,然后扫描排序后的列表进行输出,它的效率更快一些,避免第二次读取数据。并且把随机IO变成了顺序IO,但是他会使用更多的空间,因为它的每一行都保存在内存中了

        3. 单路排序可能会出现的问题:在sort_buffer中,方法B比方法A要多占用很多空间,因为方法B是把所有字段都取出,所以有可能取出的数据的总大小超出了sort_buffer的容量,导致每次只能读取sort_buffer容量大小的数据,进行排序(创建tmp文件,进行多路合并),排完再取sort_buffer容量大小,再排....从而多次IO.本想一次IO结果造成多次IO

      3. 优化策略

        1. 增加sort_buffer_size的参数设置

        2. 增加max_length_for_sort_data参数的设置

      4. 总结

      5.  

         

    3. group by优化

posted @ 2022-06-14 23:12  IT特工  阅读(19)  评论(0编辑  收藏  举报