• mysql高级(查询截取分析)


    录:

    1、索引失效
    2、SQL性能优化四步
    3、查询优化--小表驱动大表
    4、查询优化--order by关键字优化
    5、查询优化--group by关键字优化
    6、慢查询日志分析--开启慢查询日志
    7、MySQL日志分析工具 mysqldumpslow
    8、show profiles
    9、全局查询日志

    1、索引失效    <--返回目录

      1)全值匹配我最爱:查询条件于符合索引顺序

      2)最佳左前缀法则:如果索引了多列,要遵守最左前缀法则,即查询where子句从索引的最左前列开始并且不跳过索引中的列(带头大哥要有,中间兄弟不能断)

      3)不在索引列上做任何操作(计算、函数、自动或手动类型转换),因为这样会导致索引失效而转向全表扫描

      4)存储引擎不能使用索引中范围条件右边的列

      比如:创建符合索引 idx_staffs_name_age_pos(name, age, pos), 如果查询条件是 where name='xxx' and age > 10 and pos='xxx', 则因为 age > 10 是范围查询,导致idx_staffs_name_age_pos后面的索引列用不上索引(age这个索引列还是能用上的)。

      5)尽量使用覆盖索引(只访问索引查询,索引列和查询列一致),少用 select *

      6)mysql在使用不等于(!=, <>)时无法使用索引导致全表扫描

      7)is null, is not null 也无法使用索引

      8)like 以 '%xxx' 通配符开头,导致索引失效,(如果like 'xxx%',查询ref=range)

      问题:解决like '%xxx%'时索引不被使用?  解决:使用覆盖索引

      9)字符串不加单引号索引失效

      10)少用or,用它来连接时会索引失效

    2、SQL性能优化四步    <--返回目录

      1)慢查询的开启并捕获

      2)explain+慢SQL分析

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

      4)SQL 数据库服务器的参数调优

    3、查询优化--小表驱动大表    <--返回目录

      select * from A where exists (select 1 from B where A.id=B.id): 该语法理解  将主查询的数据,放到子查询中做条件验证,根据结果来决定主查询的数据结果是否得以保留。

     

    4、查询优化--order by关键字优化    <--返回目录

      mysql 支持两种方式的排序,FileSort 和 Index。Index 效率高,它指 MySQL 扫描索引本身完成排序。FileSort效率较低。

      order by 满足两情况,会使用 Index 方式排序:

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

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

      如果不在索引列上,filesort 有两种算法:

        1)双路排序:MySQL4.1 之前是使用双路排序,意思是两次扫描磁盘,最终得到数据,读取行指针和order by列,对它们排序,然后扫描已经排好序的列表,按照列表中的值重新从列表中读。从磁盘取排序字段,在buffer进行排序,再从磁盘取其他字段。两次扫描磁盘,IO耗时,所以在MySQL4.1之后,出现了第二种改进的算法,就是单路排序。

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

      问题:在 sort_buffer 中,单路排序比双路排序要多占用更多空间,因为单路排序把所有字段都取出,所以有可能取出的数据的总大小超出了sort_buffer的容量,导致每次只能取sort_buffer容量大小的数据,进行排序(创建tmp文件,多路合并),排完再取sort_buffer容量大小,再排。。。从而多次IO。本来想省一次IO操作,反而导致了大量的IO操作,反而得不偿失。

      优化策略:增大sort_buffer_size参数的设置,增大max_length_for_sort_data参数的设置

      order by总结

      1)order by 和 where查询条件组合符合最佳左前缀法则

      2)order by a desc, b asc:这要会导致filesort

      3) 入伙

    5、查询优化--group by关键字优化    <--返回目录

      与order by类似

      group by 实质是先排序后进行分组,遵照索引键的最佳左前缀

      当无法使用索引列,增大max_length_for_sort_data参数的设置和增大sort_buffer_size参数的设置

      where高于having,能写在where限定的条件就不要写在having限定。

    6、慢查询日志分析--开启慢查询日志    <--返回目录

      慢查询日志:是 MySQL 提供的一种日志记录,用来记录在 MySQL 中响应时间超过阈值的语句,具体指运行时间超过 long_query_time 值的SQL,则会被记录到慢查询日志中。long_query_time默认值为10s。默认情况下,MySQL 没有开启慢查询日志,需要我们手动开启设置。当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。慢查询日志支持将日志记录写入文件。

      查看是否开启及如何开启:show variables like '%slow_query_log%';

      开启:set global slow_query_log=1; (只对当前数据库生效,并且重启mysql服务后失效)

       如果要永久生效,就必须修改配置文件 my.cnf(其他系统也是如此)。修改my.cnf文件,在[mysqld]下增加或修改参数:

    [mysqld]
    slow_query_log=1
    slow_query_log_file=/var/lib/mysql/slow.log

      查看慢查询阈值时间:show variables like 'long_quer';

       修改慢查询阈值时间: set global long_query_time=3;

      重新连接或新开一个会话,才能看到生效的结果

      查看记录的慢查询日志:

       查看当前系统有多少条慢查询日志:show global status like '%Slow_queries%';

       总结,开发时开启,线上不开启。开发时在 my.cnf配置

    [mysqld]
    slow_query_log=1
    slow_query_log_file=/var/lib/mysql/slow.log
    long_query_time=3
    log_output=FILE

      

    7、MySQL日志分析工具 mysqldumpslow    <--返回目录

      mysqldumpslow --help

     

       常见用法:

      mysqldumpslow -s r -t 10 /var/lib/mysql/localhost-slow.log

    8、show profiles    <--返回目录

      show profiles: 是 MySQL 提供用来分析当前会话中语句执行的资源消耗情况。可以用于 SQL 调优的测量。

      官网:http://dev.mysql.com/doc/refman/5.5/en/show-profile.html

      默认该参数处于关闭状态,并保存最近15次的运行结果。

      查看 MySQL 是否支持:show variables like '%profiling%';

      开启:set profiling=on;

      查看SQL语句执行的总时长:show profiles

       诊断SQL(查看SQL执行生命周期中的每一步花费时长): show profile cpu,block io for query [Query_ID];

       诊断SQL结果分析:(出现哪些情况表明SQL有问题?)

    9、全局查询日志    <--返回目录

      全局查询日志:永远不要在生产环境使用。

      查看:show variables like '%general_log%';

      开启:set global general_log=1;

            set global log_output='TABLE';

      开启全局日志查询后,所有执行的 SQL 语句,将会记录到 MySQL 库里的general_log 表,可以使用命令查看:select * from mysql.general_log;

      my.cnf 配置:

    general_log=1
    general_log_file=/var/lib/mysql/all.log
    log_output=FILE

    ---

  • 相关阅读:
    [原创]mac终端前面的计算机名怎么改??
    iOS获取当前设备方向
    mac电脑Coding显示/隐藏文件
    从tomcat7升级到tomcat8的一个坑
    Tomcat环境开发技巧
    No.2 网络功能
    No.1 持久化
    No.0 项目起步
    读mysqlbinlog二三事
    版本号小常识
  • 原文地址:https://www.cnblogs.com/xy-ouyang/p/13338086.html
Copyright © 2020-2023  润新知