第二章 select语句优化 (三) —— 索引合并优化

文章详细介绍了MySQL中索引合并访问方法,包括交叉、联盟和排序-联合三种算法,以及它们在处理多条件查询时如何工作。索引合并用于合并单个表的多个索引扫描,但不适用于跨表扫描。优化器根据成本估算选择最佳的算法。同时,文章提到了一些已知限制和如何通过optimizer_switch系统变量来控制这些优化策略。
摘要由CSDN通过智能技术生成

索引合并访问方法使用对多个范围扫描来检索行,并将这些检索到的行合并在一起。此访问方法仅合并来自单个表的索引扫描,而不能来自跨多个表扫描。在这些基础扫描获取的行集基础上,合并可以产生并集、交集或交集后并集。

以下是可以使用索引合并的查询示例:(说明:keyN是索引,key1_part1 和 key1_part2表示多列复合索引的两个列,non_key表示无索引)

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);

注意: 该指数的合并优化算法具有以下已知的限制: 如果你查询有一个复杂其中的条款与深和/或筑巢和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)

指标合并不是适用于全文索引。

在解释输出,索引的合并方法出现为index_merge的类型列。 在这种情况下,关键柱包含一系列的索引用,并key_len含有一个列表中的最关键的部分对这些索引。 该指数的合并访问的方法有几种算法,这些都显示在外场的解释输出:

  • 使用交叉(...)

  • 使用联盟(...)

  • 使用sort_union(...)

以下各节描述了这些算法更加详细的说明。 优化器选择之间不同的可能的指标合并的算法和其他访问方法的基础上估计费用各种可用的选项。

  • 指标合并交叉问算法

  • 指标合并联盟访问算法

  • 指标合并排序-联合访问的算法

  • 影响指标合并优化

指标合并交叉问算法

这种访问算法适用时,一个其中的条款转化为几项条件的范围在不同的钥匙合并,每个条件是下列之一:

  • N部分表达这种形式,其中的指数具有完全N部分(也就是说,所有索引的部分是复盖):

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

任何范围条件的主要关键的一个少表。 实例:

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;

该指数的合并交叉点算法进行同步扫描在所有使用索引和产生的交叉路口的行列,它接收到从合并指扫描。

如果所有列在查询中使用涵盖使用的指标,充分表行不检索到(解释输出含有使用索引的额外领域,在这种情况下)。 这里是一例这样的查询:

SELECT COUNT(*) FROM t1 WHERE key1 = 1 AND key2 = 1;

如果使用的索引不涵盖所有列中使用的查询,充分行检索,只有当范围的条件为所有用钥匙都得到满足。

如果一个合并的条件是有条件的主要关键的一个少表,它不是用于行检索,但是用于筛选出行检索使用其他条件。 指标合并联盟访问算法 标准对于这个算法的那些类似的指标合并交叉点算法。 算法是适用时表的其中的条款转化为几项条件的范围在不同的钥匙结合或者,每一个条件是下列之一:

  • N部分表达这种形式,其中的指数具有完全N部分(也就是说,所有索引的部分是复盖):

key_part1 = const1 OR key_part2 = const2 ... OR key_partN = constN
  • 任何范围的条件在一个主要关键的一个少表。

  • 一个条件,其索引的合并交叉点算法是适用的。

实例:

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;

指标合并排序-联合访问的算法

这种访问算法适用时,其中的条款转化为几项条件的范围结合或通过,但是索引合并联盟的算法是不适用的。

实例:

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;

之间的差别排序-联合算法和联盟的算法是,这种联盟的算法必须首先取行Id所有行和排他们返回之前,任何行。 影响指标合并优化

使用的指标合并受到价值的

index_merge,index_merge_intersection,index_merge_union,并index_merge_sort_union标志的optimizer_switch系统变量。 见第8.9.2,"可切换的优化". 默认情况下,所有那些标志。 使只有某些算法,设index_merge到关闭,只允许这类人以应被允许的。

除了使用optimizer_switch系统变量控制,优化使用的指标合并的算法会议范围内,MySQL支持优化暗示来影响的优化每个语句的基础。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨慕晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值