mysql 索引合并

news/2024/7/7 18:27:17
索引合并是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 < 10 AND key_col1 = 20;
SELECT * FROM tbl_name
WHERE key1_part1 = 1 AND key1_part2 = 2 AND key2 = 2;

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;
SELECT * FROM tbl_name
WHERE (key_col1 > 10 OR key_col2 = 20) AND nonkey_col = 30;

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


http://lihuaxi.xjx100.cn/news/283879.html

相关文章

美国是名副其实的“黑客帝国”

2月17日&#xff0c;外交部发言人耿爽主持网上例行记者会。问&#xff1a;据报道&#xff0c;美国情报部门自冷战时期至2000年代初期&#xff0c;一直控制瑞士加密公司克里普托( Crypto AG )&#xff0c;向外国政府和企业出售加密机器&#xff0c;一边赚取数以百万计美元&#…

不安装Oracle使用cx_Oracle

使用Python连接Oracle数据库的环境非常麻烦&#xff0c;尤其在window下的配置&#xff0c;默认情况下需要安装Oracle数据库才行&#xff0c;对于不想在机器上安装Oracle的用户来讲&#xff0c;安装过程会出现各种问题。最常见的如下&#xff1a;安装出错&#xff1a;distutils.…

计算机书集下载链接

http://nic.biti.edu.cn/china-pub/ 我在那下了一本&#xff1a;XML高级编程转载于:https://www.cnblogs.com/dyuan/archive/2004/03/12/2966.html

【每日一题】 牛客 密码强度等级

题目链接 点此跳转 题目要求&#xff1a; 解题思路&#xff1a; 将每个加分项都写成一个方法&#xff0c;思路逻辑清晰&#xff0c;依次完成每一个加分方法&#xff0c;再写一个比较等级的方法&#xff0c;最后再main函数里面输出即可&#xff1a; 代码如下&#xff1a; im…

7个让你惊叹的HTML技巧

我们倾向于使用HTML与CSS、JavaScript等&#xff0c;使我们的网站或博客看起来更有吸引力。下面是一些很酷的HTML技巧&#xff0c;你可以用它来建立一个真正的动态网站。 下面是一些很酷的HTML技巧&#xff0c;你可以用它来建立一个真正的动态网站。 技巧1. Image Maps image…

Transformer, BERT, ALBERT, XLNet全面解析(ALBERT第一作者亲自讲解)

现在是国家的非常时期&#xff0c;由于疫情各地陆续延迟复工&#xff0c;以及各大院校延期开学。作为一家AI教育领域的创业公司&#xff0c;我们希望在这个非常时期做点有价值的事情&#xff0c;并携手共渡难关。在疫情期间&#xff0c;我们决定联合国内外顶尖AI专家一起筹划”…

Siri 和谷歌竟然暗藏《复联4》彩蛋!

作者 | 强忍着不剧透的唐小引与胡巍巍出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;若问 80、90 后的青春&#xff0c;《星战》系列和漫威宇宙必在其中。从《钢铁侠 1》、《美国队长 1》一路走来&#xff0c;看着超级英雄们极具使命感地穿梭于世界及星际&#xf…

mysql过滤复制的实现

这篇文章主要介绍了mysql过滤复制的实现思路&#xff0c;主要讲解了两种思路,一种是在主库的binlog上实现另一种是从库的sql线程上实现&#xff0c;具体实现过程跟随小编一起看看吧 mysql过滤复制 两种思路&#xff1a; 主库的binlog上实现&#xff08;不推荐&#xff0c;尽量…