• MySQL索引合并


    索引合并

    一般认为使用到多个索引来完成一次查询 的执行方法称之为: index merge ,具体的索引合并算法有下边三种。

    Intersection合并

    Intersection 翻译过来的意思是 交集 。这里是说某个查询可以使用多个二级索引,将从多个二级索引中查询到的结果取交集,也就是得到主键值的交集,然后再去回表查询到需要得到的信息。

    Intersection索引合并的适用场景是单独根据搜索条件从某个二级索引中获取的记录数太多,导致回 表开销太大,合并后可以明显降低回表开销,从而使用索引合并。

    MySQL 在某些特定的情况下才可能会使用到 Intersection 索引合并: 情况一:二级索引列是等值匹配的情况,对于联合索引来说,在联合索引中的每个列都必须等值匹配,不能 出现只出现匹配部分列的情况。情况二:主键列可以是范围匹配。另外,不仅是多个二级索引之间可以采用 Intersection 索引合并,索引合并也可以有聚簇索引参加,也就是我 们上边写的 情况二 :在搜索条件中有主键的范围匹配的情况下也可以使用 Intersection 索引合并索引合并。

    上边说的 情况一 和 情况二 只是发生 Intersection 索引合并的必要条件,不是充分条件。也就是说即使 情况一、情况二成立,也不一定发生 Intersection 索引合并,这得看优化器的心情。优化器只有在单独根据搜 索条件从某个二级索引中获取的记录数太多,导致回表开销太大,而通过 Intersection 索引合并后需要回表的 记录数大大减少时才会使用 Intersection 索引合并。

    只有在二级索引列都是等值匹配的情况下才可能使用 Intersection 索 引合并,是因为只有在这种情况下根据二级索引查询出的结果集是按照主键值排序的

    Union合并

    Union翻译过来的意思是 并集,这里是说某个查询可以使用多个二级索引,将从多个二级索引中查询到的结果取并集,也就是得到主键值的并集,然后再去回表查询到需要得到的信息。

    MySQL 在某些特定的情况下才可能会使用到 Union 索引合并: 情况一:二级索引列是等值匹配的情况,对于联合索引来说,在联合索引中的每个列都必须等值匹配,不能 出现只出现匹配部分列的情况。情况二:主键列可以是范围匹配 情况三:使用 Intersection 索引合并的搜索条件。当然,查询条件符合了这些情况也不一定就会采用 Union 索引合并,也得看优化器的心情。优化器只有在单独根 据搜索条件从某个二级索引中获取的记录数比较少,通过 Union 索引合并后进行访问的代价比全表扫描更小时才 会使用 Union 索引合并。

    Sort-Union合并

    Sort-Union:这里是说某个查询可以使用多个二级索引,将从多个二级索引中查询到的结果经过排序后取并集,也就是得到排好序的主键值的并集,然后再去回表查询到需要得到的信息。

    先根据 key1 < 'a' 条件从 idx_key1 二级索引总获取记录,并按照记录的主键值进行排序 再根据 key3 > 'z' 条件从 idx_key3 二级索引总获取记录,并按照记录的主键值进行排序 因为上述的两个二级索引主键值都是排好序的,剩下的操作和 Union 索引合并方式就一样了。

    Sort-Union的适用场景是单独根据搜索条件从某个二级索引中获取的记录数比较少,这样即使对这些二 级索引记录按照主键值进行排序的成本也不会太高

  • 相关阅读:
    Springboot开发时,对前端的请求参数,后端用于接受的实体类有没有必要校验为null?
    HTTP状态码504(Gateway Timeout)报错原因分析和解决办法
    论文翻译:2021_Acoustic Echo Cancellation with Cross-Domain Learning
    浅谈MySQL 索引
    Flutter Web 在《一起漫部》的性能优化探索与实践
    如何使用Python和Matplotlib创建双Y轴动态风格折线图 | 数据可视化教程
    java多线程面试总结,字节跳动java面试题
    SpringBoot与ES7实现多条件搜索
    dic= json.loads()双引号变单引号以及dic=json.dumps()出现acsll问题
    python配置到系统环境中
  • 原文地址:https://blog.csdn.net/qq_53916344/article/details/125428319