MySQL Using intersect的交集算法描述
在一次优化过程中,MySQL执行计划从三个辅助索引中选择两个,并通过UsingIntersectAlgorithm进行索引合并操作。实际上,Intersecect意味着交集。虽然对性能没有什么影响,但令人好奇的是MySQL知识系统在理解上没有交集语法。
在集合论中,设A,B为两组,由集a和集B的所有元素组成,称为集a和集B的交(交)集,记为A≤B。
MySQL没有诸如Intersec这样的语法,但是EXPLAIN使用了索引交集的算法。
1)EXPALAIN案:
进行以下查询:
当使用INTERSECT:表示使用AND的单个索引的条件时,此信息指示从处理结果中获得交集
2)通过官方谅解:
使用INTERSECT是索引合并访问方法。在解释输出的附加字段中通常会显示几种算法:
使用相交(.)
使用联合(.)
Using排序_UNION(.)
索引合并交集算法对所有使用的索引执行同步扫描,并生成从合并索引扫描中接收的行序列的交集。
3)关闭优化器行为索引_Merge_交集以实现单独的索引:
人们怀疑这种表现会更好,下面是通过概要分析进行的比较:
其中,执行时间没有使用索引交叉方法来更好地执行。因为索引合并模式执行了两次基础IO访问,导致执行时间较长。
摘要
不建议关闭优化器index_merge_交参数,因为只要数据驻留在内存中,它对性能的影响就很小,因此,当有足够的内存分配给nudbBufferpool时,保留默认值
但是,对于某些特定的SQL语句情况,需要交叉优化器选项。
在测试过程中,我们发现无论条件语句中有多少个索引,相交只选择了两个索引
与上述情况一样,建议采用联合指数法。
通过对IntersectAnalysis的分析,MySQL可以完全实现对Intersect语法的支持,希望本节将被添加到后续版本8.0中。