• mysql(三) 慢查询分析(二)


    在一般的查询中,都要求尽量围绕创建的索引进行。针对索引,常用的有主键索引,单列索引,组合索引,索引合并等。

    在评价索引时,关键看区分度。索引区分度=索引列唯一值/表记录数。

    如果在区分度很低的列上建索引,那索引扫描的rows会相当大,该索引的性能表现就基本接近全表扫描了。

    • 主键索引

    是一种特殊的唯一索引,不允许有空值。

    • 单列索引

    针对表的单一列设置索引。

    • 组合索引

    针对表的多列按列顺序设置索引。在组合索引中,基于BTree的原理,存在一个最左前缀匹配原则。如下索引(mobile_price_create_index):

    能用到索引的场景:

    mobile=a时,可以用到索引的第一列。

    mobile=a and create=c时,只能用到索引的第一列。

    mobile=a and price=b时,可以用到索引的两列。

    mobile=a and price=b and create =c时,可以用到索引的三列。

    mobile=a and price > b and create=c时,可以用到索引的前两列。

    mobile>a and price =b and create=c时,只能用到索引的第一列。

    mobile=a and price=b and create>c时,可以用到索引的三列。

    order by a时,可以用到索引。

    mobile=a order by price时,第一列过滤,第二列排序,可以用到索引。

    order by mobile desc,price desc时,此时两列排序顺序一致,可以用到索引。

    mobile > a order by a时,范围查询在第一列,排序在第一列,可以用到索引。

    用不到索引的场景:

    price=b and create=c时,用不到索引。

    order by b时,不能用到索引。

    order by mobile desc,price asc时,此时两列排序顺序不一致,用不到索引。

    mobile > a order by price时,范围查询在第一列,排序在第二列,第二列用不到索引。

    这里要声明一个误区,参数的顺序不影响使用组合索引。mobile=a and price=b and create =c 与 create=c and price=b and mobile=a是等价的。

    索引的创建要根据最常使用的参数来设定,使用时,要尽量贴合索引来实现逻辑。

    • 索引合并

    针对单表的查询,可以支持查询条件使用多个索引,然后对查询结果进行交集,并集,有序并集等处理。

    mysql支持在针对单表的查询时,合并多个索引的查询结果。

    如下索引结构:

    执行如下执行计划:

    explain select * from trade_order where gmt_create >'2018-06-02 13:25:23' or mobile ='mobile-3679';

    这个sql中使用了合并索引,分别针对gmt_create和mobile使用了2个索引。然后将其结果集求并集之后排序。

    针对or的查询条件,组合索引不能起到有效的作用。此时可以通过在条件上建单独的索引,然后合并使用。

    针对and的查询条件,创建组合索引效率更好,退而求其次时,可以选择创建多个索引,然后合并使用。

    那如果出现慢查询,可以根据执行计划,看是否未命中索引,命中的索引区分度是否足够,组合索引是否满足最左前缀的原则,如果索引只能命中一部分,是否可以通过合并索引的方式改进sql。

  • 相关阅读:
    低版本ie模式 360兼容模式的兼容性调节以及控制代码
    360浏览器兼容模式样式乱码的原因及解决办法
    iOS开发之UILabel
    代码大全--第六章--可以工作的类
    读书笔记--软件项目成功之道
    extern "C"的用法解析(转)
    基于Ubuntu 15.04 LTS编译Android5.1.0源代码 (转)
    Global.asax 文件是什么(转)
    设备扩展(DEVICE_EXTENSION)
    IRP_MJ_CREATE
  • 原文地址:https://www.cnblogs.com/asfeixue/p/9128751.html
Copyright © 2020-2023  润新知