mysql index merge - yaokun123/php-wiki GitHub Wiki

Mysql索引合并

mysql的索引合并并不是什么新特性。早在mysql5.0版本就已经实现。之所以还写这篇博文,是因为好多人还一直保留着一条sql语句只能使用一个索引的错误观念。

MySQL 5.0版本之前,一个表一次只能选择并使用一个索引。

MySQL 5.1版本开始,引入了Index Merge Optimization技术,使得MySQL支持一个表一次查询同时使用多个索引。

官方文档:https://dev.mysql.com/doc/refman/8.0/en/index-merge-optimization.html

一、什么是索引合并

下面我们看下mysql文档中对索引合并的说明

The Index Merge method is used to retrieve rows with several range scans and to merge their results into one. 
The merge can produce unions, intersections, or unions-of-intersections of its underlying scans. 
This access method merges index scans from a single table; it does not merge scans across multiple tables

1、索引合并是把几个索引的范围扫描合并成一个索引。
2、索引合并的时候,会对索引进行并集,交集或者先交集再并集操作,以便合并成一个索引。
3、这些需要合并的索引只能是一个表的。不能对多表进行索引合并。

Index Merge Optimization支持三种合并算法

1、The Index Merge Intersection Access Algorithm
    对应SQL 中的 AND 场景

2、The Index Merge Union Access Algorithm
    对应SQL中的 OR 场景(where条件是等值判断)

3、The Index Merge Sort-Union Access Algorithm
    对应SQL中的 OR 场景(where条件是范围查询)

二、怎么确定使用了索引合并

在使用explain对sql语句进行操作时,如果使用了索引合并,那么在输出内容的type列会显示 index_merge,key列会显示出所有使用的索引。

三、注意

相同模式的sql语句,可能有时能使用索引,有时不能使用索引。是否能使用索引,取决于mysql查询优化器对统计数据分析后,是否认为使用索引更快。

因此,单纯的讨论一条sql是否可以使用索引有点片面,还需要考虑数据。

mysql5.6.7之前的版本遵守range优先的原则。也就是说,当一个索引的一个连续段,包含所有符合查询要求的数据时,哪怕索引合并能提供效率,也不再使用索引合并。