怎么做seo网站推广,网站设计时多页面切换时什么控件,免实名域名购买,中国少数民族网站建设主博客#xff1a;
【MySQL精通之路】SQL优化(1)-CSDN博客
上一篇#xff1a;
【MySQL精通之路】SQL优化(1)-查询优化(2)-范围查询优化-CSDN博客
下一篇#xff1a; 目录
1.索引合并-交集访问算法
2.索引合并联合访问算法
3.索引合并-排序联合访问算法
4.影响索引合…主博客
【MySQL精通之路】SQL优化(1)-CSDN博客
上一篇
【MySQL精通之路】SQL优化(1)-查询优化(2)-范围查询优化-CSDN博客
下一篇 目录
1.索引合并-交集访问算法
2.索引合并联合访问算法
3.索引合并-排序联合访问算法
4.影响索引合并优化 Index Merge访问方法检索具有多个范围扫描的行并将其结果合并为一个。 博主PS。 没有索引合并逻辑之前 数据库在where条件查询数据时如果a条件查询完成后a条件过滤出的主键去聚簇索引查找数据(回表查询。b条件c条件同理。 最后在通过查询条件之间是and还是or对结果进行过滤如果是and就取交集如果是or就取并集。 索引合并后 就提前做这个操作了。先把二级索引上过滤出的主键根据查询条件是and还是or取交集或并集。得出过滤后的主键之后再用过滤后的主键进行回表查询大大减少回表次数。 此查询仅合并来自单个表的索引扫描而不合并跨多个表的扫描。合并可以生成其基础扫描的并集、交集或交集的并集。 博主PS。之所以不可以跨表是因为最终回表查询的时候要将过滤后的主键在同一个聚簇索引进行回表所以不能跨表跨表就等于在多个聚簇索引操作数据了。 可以使用索引合并的查询示例
SELECT * FROM tbl_name WHERE key1 10 OR key2 20;SELECT * FROM tbl_nameWHERE (key1 10 OR key2 20) AND non_key 30;SELECT * FROM t1, t2WHERE (t1.key1 IN (1,2) OR t1.key2 LIKE value%)AND t2.key1 t1.some_col;SELECT * FROM t1, t2WHERE t1.key1 1AND (t2.key1 t1.some_col OR t2.key2 t1.some_col2); 注意 索引合并优化算法具有以下已知限制 如果您的查询带有嵌套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) 索引合并不适用于全文索引。 在EXPLAIN输出中Index Merge方法在type列中显示为Index_Merge。
在这种情况下键列包含使用的索引列表key_len包含这些索引的最长键部分列表。
Index Merge访问方法有几种算法显示在EXPLAIN输出的Extra字段中 Using intersect(...) Using union(...) Using sort_union(...) 以下部分将更详细地描述这些算法。优化器根据各种可用配置的成本估计在不同可能的索引合并算法和其他访问方法之间进行选择。 1.索引合并-交集访问算法
当WHERE子句与AND组合转换为不同键上的几个范围条件时此访问算法适用并且每个条件都是以下条件之一
这种形式的N部分表达式其中索引正好有N部分即所有索引部分都被覆盖
key_part1 const1 AND key_part2 const2 ... AND key_partN constN
InnoDB表主键上的任何范围条件。
例如
SELECT * FROM innodb_tableWHERE primary_key 10 AND key_col1 20;SELECT * FROM tbl_nameWHERE key1_part1 1 AND key1_part2 2 AND key2 2;
索引合并交集算法对所有使用的索引执行同时扫描并生成从合并索引扫描中接收的行的交集。
如果查询中使用的所有列都被使用的索引覆盖则不会检索完整的表行不会回表查询在这种情况下EXPLAIN输出在Extra字段中包含Using index。
以下是这样一个查询的示例
SELECT COUNT(*) FROM t1 WHERE key1 1 AND key2 1;
如果使用的索引没有覆盖查询中使用的所有列则只有在满足所有使用键的范围条件时才会检索完整的行。
如果合并的条件之一是InnoDB表主键上的条件则不用于行检索而是用于过滤使用其他条件检索的行。
2.索引合并联合访问算法
此算法与索引合并-联合算法的类似。当表的WHERE子句被转换为不同键上的几个范围条件并与OR组合时该算法适用并且每个条件都是以下条件之一
1.这种形式的N部分表达式其中索引正好有N部分即所有索引部分都被覆盖
key_part1 const1 OR key_part2 const2 ... OR key_partN constN
2.InnoDB表主键上的任何范围条件。
3.索引合并交集算法适用的条件。
例如
SELECT * FROM t1WHERE key1 1 OR key2 2 OR key3 3;SELECT * FROM innodb_tableWHERE (key1 1 AND key2 2)OR (key3 foo AND key4 bar) AND key5 5;
3.索引合并-排序联合访问算法
当WHERE子句转换为OR组合的多个范围条件时此访问算法适用但索引合并联合算法不适用。
示例
SELECT * FROM tbl_nameWHERE key_col1 10 OR key_col2 20;SELECT * FROM tbl_nameWHERE (key_col1 10 OR key_col2 20) AND nonkey_col 30;
排序联合算法和联合算法之间的区别在于排序联合算法必须首先获取所有行的行ID并在返回任何行之前对其进行排序。
4.影响索引合并优化
索引合并的使用取决于optimizer_switch系统变量的index_merge, index_merge_intersection、index_merge_union, index_merge_sort_union标志的值。 参见“可切换优化”。 默认情况下所有这些标志都处于启用状态。
若要仅启用某些算法请将index_merge设置为禁用并仅启用应允许的其他算法。
除了使用optimizer_switch系统变量来控制优化器在整个会话范围内使用索引合并算法之外MySQL还支持优化器提示以在每条语句的基础上影响优化器。 参见“优化器提示”。