前言,MySQL优化利器⭐️索引条件下推,千万数据下性能提升273%,MySQL的优化利器⭐️Multi Range Read与Covering Index是如何优化回表的?MySQL导致索引失效的八股文中有这样一条:使用or会导致索引失效,那么是不是所有场景都会失效呢?带着这个问题,我们往下看。案例使用上篇文章的座位表,并分别建立seat_code、student_id两个二级索引。索引合并的优化分成三种方式:index merge intersection, index merge union, index merge sort union。index merge intersection 是用于交集的索引合并,交集往往和查询条件中的and相关。举例这样一条SQL,当不使用索引合并优化时,优化器可能选择seat_code索引或者student_id索引,当使用seat_code索引时,先在索引中找到满足seat_code = caicaiseat的记录,再回表查询聚簇索引获取完整记录。开启交集索引合并,查看执行计划,使用到这两个索引,附加信息显示用到交集索引合并,并且还用上覆盖索引不需要回表。index merge union是用于并集的索引合并,并集往往与查询条件or相关。举例这样一条SQL,当不使用index merge union的情况下,会直接全表扫描(聚簇索引),依次判断记录是否满足条件,开启union优化,查看执行计划:已经使用index merge union。index merge sort union 排序的并集索引合并:对主键值无序的场景排序后再进行并集。总结,index merge索引合并优化默认开启,分为intersection交集、union并集、sort union排序并集三种方式。使用前提需要主键有序,因为主键乱序需要先排序再进行交集/并集,否则会有随机IO。由于index merge union中or容易导致优化器认为回表成本大进而全表扫描,而满足主键有序的场景太苛刻,因此使用index merge sort union 在主键乱序的情况下排序再取并集。