阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

mysql 索引合并

60次阅读
没有评论

共计 1939 个字符,预计需要花费 5 分钟才能阅读完成。

导读 索引合并是 mysql 底层为我们提供的智能算法。本文就介绍了 mysql 索引合并的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

索引合并是 mysql 底层为我们提供的智能算法。了解索引合并的算法,有助于我们更好的创建索引。

索引合并是通过多个 range 类型的扫描并且合并它们的结果集来检索行的。仅合并来自单个表的索引扫描,而不是跨多个表的索引扫描。合并会产生底层扫描的三种形式:unions(合并)、intersections(交集)、unions-of-intersections(先取交集再合并)。

以下四个例子会产生索引合并:

SELECT * FROM tbl_name WHERE key1 = 10 OR key2 = 20;
SELECT * FROM tbl_name WHERE (key1 = 10 OR key2 = 20) AND non_key = 30;
SELECT * FROM t1, t2 WHERE (t1.key1 IN (1,2) OR t1.key2 LIKE 'value%') AND t2.key1 = t1.some_col;
SELECT * FROM t1, t2 WHERE t1.key1 = 1 AND (t2.key1 = t1.some_col OR t2.key2 = t1.some_col2);
索引合并有以下已知的局限性:

1、如果查询语句包含一个带有严重 AND/OR 嵌套的复杂的 WHERE 子句而 MySQL 没有选择最佳计划,那么可以尝试使用以下的标志符转换:

(x AND y) OR z => (x OR z) AND (y OR z)
(x OR y) AND z => (x AND z) OR (y AND z)

2、索引合并不适用于全文索引。

在 EXPLAIN 语句输出的信息中,索引合并在 type 列中表现为“index_merge”,在这种情况下,key 列包含使用的索引列表。
索引合并访问方法有几种算法,表现在 EXPLAIN 语句输出的 Extra 字段中:

Using intersect(...)
Using union(...)
Using sort_union(...)

下面将更详细地描述这些算法。优化器根据各种可用选项的成本估计,在不同的索引合并算法和其他访问方法之间进行选择。

Index Merge Intersection 算法

Index Merge Intersection 算法对所有使用的索引执行同步扫描,并生成从合并的索引扫描接收到的行序列的交集。

这种算法适用于当 WHERE 子句被转换成多个使用 AND 连接的不同索引 key 上的范围条件,且条件是以下两种之一:

一、这种形式的 N 部分表达式,索引正好包括 N 个字段(所有索引字段都被覆盖),N>=1,N 如果大于 1 就是复合索引:

key_part1 = const1 AND key_part2 = const2 ... AND key_partN = constN。

二、InnoDB 表主键上的任何范围条件。

例子:

SELECT * FROM innodb_table
WHERE primary_key 

Index Merge Union 算法

该算法类似于 Index Merge Intersection 算法,适用于当 WHERE 子句被转换成多个使用 OR 连接的不同索引 key 上的范围条件,且条件是以下三种之一:

一、这种形式的 N 部分表达式,索引正好包括 N 个字段(所有索引字段都被覆盖),N>=1,N 如果大于 1 就是复合索引:

key_part1 = const1 AND key_part2 = const2 ... AND key_partN = constN。

二、InnoDB 表主键上的任何范围条件。

三、符合 Index Merge Intersection 算法的条件。

例子:

SELECT * FROM t1
WHERE key1 = 1 OR key2 = 2 OR key3 = 3;
SELECT * FROM innodb_table
WHERE (key1 = 1 AND key2 = 2)
OR (key3 = 'foo' AND key4 = 'bar') AND key5 = 5;

Index Merge Sort-Union 算法

该算法适用于当 WHERE 子句被转换成多个使用 OR 连接的不同索引 key 上的范围条件,但是不符合 Index Merge Union 算法的。Index Merge Sort-Union 和 Index Merge Union 算法的区别在于,Index Merge Sort-Union 必须首先获取所有行的行 id 并在返回任何行之前对它们进行排序。

例子:

SELECT * FROM tbl_name
WHERE key_col1  10 OR key_col2 = 20) AND nonkey_col = 30;

到此这篇关于 mysql 索引合并的使用的文章就介绍到这了

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计1939字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中