美文网首页
查询截取分析与优化

查询截取分析与优化

作者: 魔芋辣椒 | 来源:发表于2020-08-17 13:32 被阅读0次

    分析步骤:

    • 慢查询日志与捕获
    • explain+慢查询日志分析
    • show profile查询sql在mysql服务器中的执行细节和生命周期
    • sql服务器参数调优

    一、explain

    explain用于分析查询语句的性能.

    包含字段:id,select_type,table,type,possible_keys,key,key_len,ref,rows,Extra
    字段解释

    • id
      表示表的读取顺序
         若id相同,执行顺序从上到下
         若id不同,执行顺序从大id到小id

    • select_type
      表示查询类型
          simple:普通查询
          primary:子查寻中最外层
          subquery:select,where包含的子查询
          derived:from后面的子查询

    • table

    • type

    system>const>eq_ref>ref>range>index>all


    image.png
    • possible_keys
      该字段和key一起用来查看哪个索引可能被使用

    • key

    • key_len
      查询索引使用的字节数,长度越短越好

    • ref
      说明索引实际使用了哪些值,即where等号右值

    • rows
      有多少行被查询过

    • Extra

      • using filesort :索引的排序未用到,使用文件排序(坏🌟🌟)
      • using temperory:产生了新的临时表,常见于order,group没利用索引(坏🌟🌟🌟)
      • using index:使用了索引(好)
      • using where:使用了索引去约束(好)

    二、查询优化

    2.1 小表驱动大表

    原则:外层循环要是小数据
    驱动方式 :in exit

    若B数据集小,则使用in

    select * from A where id in (select id from b)
    等价于
    for select B
      for select A ...where b.id=a.id
    

    若A数据集小,则使用exit

    select * from A where exits (select 1 from b where b.id=a.id);
    等价于
    for select A
      for select B...where b.id=a.id
    

    2.2 where优化(其中5是select优化)

    1. 全值匹配是最优的查询(指where后条件都有索引去匹配)

    2. 要遵循最佳左前缀法则『法则指的是---查询时,索引最前面的大哥不能无,中间也不能跳过

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

    4. where中,范围条件右边的查找列会失效,索引用不到他,因此要注意这点

    5. ;尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),因此要减少select*『目的是使用到using index

    6. mysq|在使用不等于(!:或者<>)的时候无法使用索引会导致全表扫扫描

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

    8. like以通配符开头('%abc...')mysql*'引失效会变成全表扫描。右侧单百分号会稍好点。解决方法:使用覆盖索引

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

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

    带头大哥不能死,中间兄弟不能断,索引列上无计算,like百分加右边,范围之后全失效(包含like in等),字符串里有引号

    顺序不按索引的order by 会导致using filesort,group by同理,分组前必排序。
    案例

    image.png

    2.3 order by优化 group by与他相同

    1. 尽量在索引列上排序,使用索引要想避免using filesort 就要遵循最佳左前缀
    2. 尽量不要使用select *
      当查询字段量小于max_length_for_sort_data,会使用单路复用,否则多路降低性能
    3. 优化filesort
      filesort分为双路排序(两次io,旧,慢)和单路排序,但有可能数据量大于单路缓冲区
      优化方法
      增加sort_buffer_size、max_length_for_sort_data大小

    order by a ASE ,b DESC 不一致 无法使用索引
    若最左前缀是常量,则直接order by 第二个 可以使用索引 即:where a=const order by b


    image.png

    三、慢查询日志

    日志默认关闭,开启会影响性能
    set global_slow_query_log=1;开启 重启后失效
    set global_long_query_log=xxx; >xxx秒被记录

    3.1 分析工具 mysqldumpslow

    四、show profile

    查看资源消耗情况

    show profiles
    show profile cpu,block io for query xx
    危险状态

    • converting heap to myisam
    • create tmp table
    • copying to tmp table on disk
    • lock

    相关文章

      网友评论

          本文标题:查询截取分析与优化

          本文链接:https://www.haomeiwen.com/subject/olxqjktx.html