0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是索引合优化?探究一下索引合并的几种情况

dyquk4xk2p3d 来源:后端开发威廉希尔官方网站 2023-09-26 09:14 次阅读

什么是索引合优化

在使用 explain 命令分析 SQL 执行情况的时候,type列会描述了表如何被连接,这个列的内容直接反映了 SQL 执行的效率。当里面的内容展示为 index_merge时表示使用了索引合并优化,在这种情况下输出行中的key列包含具体使用的索引。

a216de48-5bfc-11ee-939d-92fbcf53809c.png

MySQL 的索引合并优化是一种查询优化威廉希尔官方网站 ,它利用多个索引来加速查询的执行。当一个查询中包含多个条件,并且这些条件分别适用于不同的索引时,MySQL 可以将这些索引合并起来使用,减少了回表的次数,以加速查询的执行。

简单来说过程是这样:

查询条件同时包含 index1 和 index2。

在根据 index1 和 index2 查询到主键后并没有直接分别去聚簇索引中查询,而是先对他们查到的主键做处理,合并到一起。

根据处理后的主键去聚簇索引执行查询,只需一次回表就可以拿到结果。

a222e6d4-5bfc-11ee-939d-92fbcf53809c.png

下面我们探究一下索引合并的几种情况。

准备

我们使用如下数据做测试,并且建立了三个索引。

CREATETABLE`test_table`(
`id`bigint(20)NOTNULLAUTO_INCREMENT,
`user_id`bigint(20)NOTNULL,
`name`varchar(255)DEFAULT'',
`merchant_id`bigint(20)NOTNULL,
`area`int(11)DEFAULTNULL,
PRIMARYKEY(`id`),
UNIQUEKEY`uq_user_id`(`user_id`)USINGBTREE,
KEY`idx_merchant_id`(`merchant_id`)USINGBTREE,
KEY`idx_area`(`area`)USINGBTREE
)ENGINE=InnoDBAUTO_INCREMENT=410DEFAULTCHARSET=utf8mb4

在表中,我初始化了 100 多条数据用于测试。

基本用法

Index Merge 通过多次 range扫描检索行并将它们的结果合并为一个。仅限合并来自单个表的索引扫描,而不是跨多个表的扫描。合并可以产生其底层扫描的并集、交集或交集并集,所以产生了三种算法

可以使用索引合并的示例查询:

SELECT*FROMtest_tableWHEREmerchant_id=3ORarea=3;

SELECT*FROMtest_tableWHERE(merchant_id=3ORarea=3)ANDname='daniel';

SELECT*FROMt1,t2
WHERE(t1.key1IN(1,2)ORt1.key2LIKE'value%')
ANDt2.key1=t1.some_col;

SELECT*FROMt1,t2
WHEREt1.key1=1
AND(t2.key1=t1.some_colORt2.key2=t1.some_col2);

索引合并优化算法注意事项如下

1、如果您的查询有一个复杂的WHERE 子句,带有深度 AND/OR 嵌套,而 MySQL 没有选择最佳执行计划,请尝试使用以下恒等变换。

(xANDy)ORz=>(xORz)AND(yORz)
(xORy)ANDz=>(xANDz)OR(yANDz)

2、Index Merge 不适用于全文索引。

三种算法

Index Merge 访问方法有几种算法,显示在输出Extra字段 中EXPLAIN:

交集算法Using intersect(...)

并集算法 Using union(...)

排序并集算法Using sort_union(...)

下面我们详细介绍这些算法,优化器根据各种可用选项的成本估算,在不同的索引合并算法之间进行选择。

Index Merge 的使用受制于 系统变量的index_merge、 index_merge_intersection、 index_merge_union和 index_merge_sort_unionflags 的值optimizer_switch 。默认情况下,所有这些标志都是on. 要仅启用某些算法,请设置index_merge 为off,并仅启用应允许的其他算法。

1.交集算法

当查询条件是多个查询的时候,并且条件用 and 关联,这种情况会使用交集(intersect)算法,满足以下条件之一都可以。

这种形式的 -part 表达式*N*,其中索引具有精确的 *N*部分(即,所有索引部分都被覆盖):

key_part1=const1ANDkey_part2=const2...ANDkey_partN=constN
a22bcce0-5bfc-11ee-939d-92fbcf53809c.png

InnoDB 引擎下使用主键范围条件查询。如果其中一个 merge 条件是对表主键的范围查询,则它不用于行检索,而是用于过滤掉使用其他条件检索的行。

explainselect*fromtest_tablewhereid<  100   and area=3;
a23ccf40-5bfc-11ee-939d-92fbcf53809c.png

索引合并交集算法对所有使用的索引执行同时扫描,并生成它从合并索引扫描中接收到的主键的交集。如果查询中使用的所有列都被使用的索引覆盖,则不会检索完整的表行(具体使用的算法输出在 Extra 字段中)。

2.并集算法

并集(union)算法适用于将表的WHERE 子句转换为不同索引列组合的多个范围条件,并且使用OR关联,且每个条件为以下之一:

不同普通索引列使用 or 关联

key_part1=const1ORkey_part2=const2...ORkey_partN=constN

InnoDB引擎下主键使用范围查询

例子:

explainselect*fromtest_tablewheremerchant_id=3orarea=3;
a244602a-5bfc-11ee-939d-92fbcf53809c.png

3.排序并集算法

排序并集(sort_union)算法适用于由 or 关键词组合的多个范围查询。

例子:

explainselect*fromtest_tablewheremerchant_id< 3 or area<3;

sort-union 算法和 union 算法之间的区别在于,sort-union 算法必须首先获取所有行的行 ID ,然后在回表之前它们进行排序。

a247fb22-5bfc-11ee-939d-92fbcf53809c.png








审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SQL
    SQL
    +关注

    关注

    1

    文章

    764

    浏览量

    44127
  • MYSQL数据库
    +关注

    关注

    0

    文章

    96

    浏览量

    9390

原文标题:面试官:会SQL调优,那你知道索引合并吗?

文章出处:【微信号:良许Linux,微信公众号:良许Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何利用Flood多维索引威廉希尔官方网站 实现优化数据存储布局

    R-Trees,Z-ordering等,然而这些索引结构在不同的数据集以及查询集合(query workload)很难进行统优化。在本篇论文中,提出了名为Flood的多维学习
    的头像 发表于 09-22 16:38 3799次阅读
    如何利用Flood多维<b class='flag-5'>索引</b>威廉希尔官方网站
实现<b class='flag-5'>优化</b>数据存储布局

    基于索引的SQL语句优化之降龙十八掌

    使用全表扫描还是使用索引和所有的秘笈样,最后招都会又回到起点,最后我们来讨论一下是否需要建立索引,也许进行全表扫描更快。在大多数
    发表于 09-25 13:24

    LV Nugget之数组索引的妙用

    数组元素。下图所示的例子在初学者编程中经常遇到,这是我最近遇到初学者的用法。上述操作使用索引数组函数即可以实现,如下图所示。如果索引数组函数的索引端子不连接,首个
    发表于 11-16 13:50

    LabVIEW Nugget之数组索引的妙用

    数组元素。下图所示的例子在初学者编程中经常遇到,这是我最近遇到初学者的用法。上述操作使用索引数组函数即可以实现,如下图所示。如果索引数组函数的索引端子不连接,首个
    发表于 12-18 15:02

    求各位大神指点一下,关于自动索引

    请各位大神指点一下怎么关闭labview2015 for循环中的”自动索引“,我右击那个左边框上面的小方框,没有关闭选项
    发表于 05-21 01:12

    Mysql优化选择最佳索引规则

    索引的目的在于提高查询效率,其功能可类比字典,通过该索引可以查询到我们想要查询的信息,因此,选择建立好的索引十分重要,以下是为Mysql优化选择最佳
    发表于 07-06 15:13

    MySQL索引使用优化和规范

    MySQL - 索引使用优化和规范
    发表于 06-15 16:01

    MySQL索引的使用问题

    、前言 在MySQL中进行SQL优化的时候,经常会在情况下,对MySQL能否利用索引
    的头像 发表于 01-06 16:13 1612次阅读

    一百道关于MySQL索引解答

    数据库 1. MySQL索引使用有哪些注意事项呢? 可以从三个维度回答这个问题:索引哪些情况会失效,索引不适合哪些场景,索引规则
    的头像 发表于 06-13 15:51 2102次阅读

    数据库索引使用策略及优化

    索引使用策略及优化 MySQL的优化主要分为结构优化(Scheme optimization)和查询优化(Query optimizatio
    的头像 发表于 11-02 15:13 1720次阅读
    数据库<b class='flag-5'>索引</b>使用策略及<b class='flag-5'>优化</b>

    MySQL高级进阶:索引优化

    MySQL官方对于索引的定义:索引是帮助MySQL高效获取数据的数据结构。
    的头像 发表于 06-11 11:13 576次阅读
    MySQL高级进阶:<b class='flag-5'>索引</b><b class='flag-5'>优化</b>

    Mysql索引是什么东西?索引有哪些特性?索引是如何工作的?

    作为开发人员,碰到了执行时间较长的 sql 时,基本上大家都会说” 加个索引吧”。但是索引是什么东西,索引有哪些特性,下面和大家简单讨论一下
    的头像 发表于 12-24 16:20 1313次阅读
    Mysql<b class='flag-5'>索引</b>是什么东西?<b class='flag-5'>索引</b>有哪些特性?<b class='flag-5'>索引</b>是如何工作的?

    导致MySQL索引失效的情况以及相应的解决方法

    导致MySQL索引失效的情况以及相应的解决方法  MySQL索引的目的是提高查询效率,但有些情况下索引可能会失效,导致查询变慢或效果不如预期
    的头像 发表于 12-28 10:01 760次阅读

    谷歌搜索引优化的各个方面和步骤

    谷歌搜索引擎是最受欢迎和广泛使用的搜索引擎之,为了使你的网站在谷歌上更好地排名并提高曝光度,你可以采取些谷歌搜索引
    的头像 发表于 01-25 10:29 887次阅读

    MATLAB中的矩阵索引

    对矩阵进行索引是从矩阵中选择或修改部分元素的种方式。MATLAB 有几种索引样式,它们不仅功能强大、灵活,而且可读性强、表现力强。矩阵是 MATLAB 用来组织和分析数据的
    的头像 发表于 09-05 09:28 463次阅读
    MATLAB中的矩阵<b class='flag-5'>索引</b>