Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用联合索引优化查询效率

使用联合索引优化查询效率

作者头像
孟斯特
发布于 2024-06-11 10:55:13
发布于 2024-06-11 10:55:13
53500
代码可运行
举报
文章被收录于专栏:code人生code人生
运行总次数:0
代码可运行

数据库设计和查询优化中,联合索引是一个强大的工具,它可以显著提高数据检索的速度。然而,要充分利用联合索引的优势,我们需要理解它们是如何影响查询效率的。本文将探讨联合索引的工作原理以及如何使用它们来优化查询。

联合索引的工作原理

联合索引的原理基于数据库管理系统(DBMS)如何存储和检索数据的方式。联合索引,也称为复合索引,涉及在数据库表的两个或更多列上创建索引。这种索引类型允许数据库在执行查询时,同时利用多个列的索引,从而提高数据检索的效率。以下是联合索引工作原理的详细介绍:

索引结构

大多数数据库系统使用B树(平衡树)或其变种(如B+树)作为索引的底层数据结构。B树是一种自平衡树,它保持数据排序,允许搜索、顺序访问、插入和删除操作在对数时间内完成。在联合索引中,B树的每个节点不仅包含单个键值,而是包含了多个列的键值组合。

键值组合

在联合索引中,索引的键是由多个列的值组合而成的。例如,如果有一个联合索引包含列A和列B,那么索引的键将是(A, B)的值对。数据库在创建索引时,会根据这些列的值对数据进行排序和存储。

索引顺序

在联合索引中,列的顺序非常重要。索引的效率取决于查询条件如何与索引列的顺序匹配。数据库在处理查询时,会按照索引定义中的列顺序从左到右匹配条件。如果查询的第一个条件是索引的第一个列,那么数据库可以高效地利用索引。如果查询的第一个条件不是索引的第一个列,索引的效果会大打折扣。

索引查找

当数据库执行一个查询时,它会尝试使用可用的索引来加速数据检索。对于联合索引,数据库会在B树中查找满足查询条件的键值组合。这个过程通常涉及到遍历B树的路径,直到找到匹配的节点。由于数据已经根据索引键排序,数据库可以快速定位到满足条件的数据范围,然后从中检索需要的记录。

等值和范围查询

联合索引对等值查询(例如WHERE A=1 AND B=2)特别有效,因为它可以直接定位到具有特定键值组合的记录。对于范围查询(例如WHERE A=1 AND B>2),联合索引同样有用,但是一旦遇到范围条件,索引中该条件之后的列就不会被用于优化查询。

索引覆盖

如果一个查询只需要访问联合索引中的列,那么这个查询可以完全通过索引来满足,无需访问表中的实际数据。这种情况被称为索引覆盖,可以极大地提高查询性能。

示例

以下面的SQL为例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE test (
    id INT NOT NULL AUTO_INCREMENT,
    a INT NOT NULL,
    b INT NOT NULL,
    c INT NOT NULL,
    PRIMARY KEY (id)
);

查询时,如果使用下面的SQL:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM test WHERE a = 1 AND b = 1 AND c = 1;

在数据量不大的时候,这个查询的速度可能很快,但是随着数据量的增加,查询速度可能会变慢。这是因为数据库需要遍历整个表,才能找到满足条件的记录。如果使用联合索引,查询速度会更快。例如,如果使用下面的SQL:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE INDEX idx_abc ON test (a, b, c);

那么查询速度会更快,因为数据库可以利用索引来快速定位到满足条件的记录。

此外,尽管SELECT *使用很方便,但在生产环境中,应该尽量避免使用SELECT *,因为这可能会导致不必要的数据传输。应该只选择需要的列,以提高查询性能。

在B+树索引结构中,联合索引 a, b, c 的创建意味着索引项是按照这三个列的值的组合排序的。在B+树中,所有的值都存储在叶子节点上,并且叶子节点是以链表的形式相互连接的,这允许快速的范围访问。

在B+树索引中,等值查询通常非常高效,因为它们可以直接导航到树的特定部分。范围查询也相对高效,因为B+树的叶子节点是有序的,并且可以通过链表顺序访问。但是,当范围查询介入时,索引的效率可能会降低,因为数据库需要遍历更多的索引项来找到所有匹配的记录。

联合索引中字段顺序的影响

在上面的例子中,我们创建了联合索引,在实际使用中下面两个查询的性能是相同的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM test WHERE a = 1 AND b = 1 AND c = 1;
SELECT * FROM test WHERE a = 1 AND c = 1 AND b = 1;

在大多数现代数据库管理系统(DBMS)中,这两个查询的性能是相同的。这是因为数据库的查询优化器会分析查询条件并决定最有效的方式来使用索引,不管这些条件在WHERE子句中的顺序如何。

WHERE a = 1 AND b > 1 AND c = 1 会命中索引吗?

查询 WHERE a = 1 AND b > 1 AND c = 1 会利用到 a, b, c 上的联合索引,但是使用方式和完全匹配(a = 1 AND b = 1 AND c = 1)的情况有所不同。

索引的部分使用

在这个查询中,因为 ac 的条件是等值查询(=),而 b 是范围查询(>),数据库可以利用联合索引的前缀部分来优化查询。具体来说:

a 的等值查询:这个条件可以直接利用索引,因为 a 是联合索引的第一个字段。数据库可以快速定位到 a = 1 的记录。•b 的范围查询:由于 b 紧随 a 后面,数据库可以在 a = 1 的基础上进一步利用索引来处理 b > 1 的条件。这个步骤会筛选出 a = 1b > 1 的记录。•c 的等值查询:尽管 c 也是索引的一部分,但由于 b 的条件是一个范围查询,对 c 的等值查询的优化效果会受到一定影响。数据库仍然可以利用索引,但是在处理 b 的范围查询之后,对 c 的过滤可能需要在已筛选的结果集上进行。

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)[1]进行许可,使用时请注明出处。 Author: mengbin[2] blog: mengbin[3] Github: mengbin92[4] cnblogs: 恋水无意[5] 腾讯云开发者社区:孟斯特[6]

References

[1] 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0): https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh [2] mengbin: mengbin1992@outlook.com [3] mengbin: https://mengbin.top [4] mengbin92: https://mengbin92.github.io/ [5] 恋水无意: https://www.cnblogs.com/lianshuiwuyi/ [6] 孟斯特: https://cloud.tencent.com/developer/user/6649301

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 孟斯特 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2021春招 | 一口气搞懂MySQL索引所有知识点
国庆期间看了数据库的很多资料和书籍,这点我在总结的数据库文章里面也提过了,然后我发现我对索引的介绍不全,所以整理了一下自己的笔记,决定来个索引完整版,老规矩可能还是没我正常文章风格那么跳,但是干货一定也能让你有所收获。
王炸
2020/10/29
6420
2021春招 | 一口气搞懂MySQL索引所有知识点
【图文详解:索引极简教程】SQL 查询性能优化原理
在一本厚厚的书籍的前几页,通常会有几页目录。作用是让读者可以快速找到感兴趣的章节进行阅读。 目录之所以可以快速阅读,是因为它提前进行了结构化+有序处理。
一个会写诗的程序员
2022/03/07
7840
【图文详解:索引极简教程】SQL 查询性能优化原理
mysql联合索引详解
上一篇文章:mysql数据库索引优化 比较简单的是单列索引(b+tree)。遇到多条件查询时,不可避免会使用到多列索引。联合索引又叫复合索引。 b+tree结构如下: 每一个磁盘块在mysql中是一个页,页大小是固定的,mysql innodb的默认的页大小是16k,每个索引会分配在页上的数量是由字段的大小决定。当字段值的长度越长,每一页上的数量就会越少,因此在一定数据量的情况下,索引的深度会越深,影响索引的查找效率。 对于复合索引(多列b+tree,使用多列值组合而成的b+tree索引)。遵循最左侧原
企鹅号小编
2018/01/29
9.1K2
SQL学习笔记五之MySQL索引原理与慢查询优化
一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重。说起加速查询,就不得不提到索引了。
Jetpropelledsnake21
2019/02/15
8960
九个实验:MySQL 联合索引的最左匹配原则
最左优先,以最左边的为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)就会停止匹配。
悟空聊架构
2023/10/02
1.8K0
MySQL 索引
索引是一种用于提高数据库查询性能的数据结构,它类似于书籍的目录,可以帮助数据库快速地定位到数据记录。索引通常是一个单独的数据结构,存储了某个列或多个列的值与对应数据行的物理存储位置之间的映射关系。
孟斯特
2024/03/25
3100
MySQL 索引
www.xttblog.com MySQL InnoDB 索引原理
此小结与索引其实没有太多的关联,但是为了便于理解索引的内容,添加此小结作为铺垫知识。
业余草
2019/01/21
1.2K0
www.xttblog.com MySQL InnoDB 索引原理
MySQL InnoDB索引:存储结构
此小结与索引其实没有太多的关联,但是为了便于理解索引的内容,添加此小结作为铺垫知识。
AlbertZhang
2020/09/21
1.2K0
B-Tree 索引简介
B-Tree(Balanced Tree)索引是 MySQL 数据库中最常见的索引类型之一,它用于加速数据的检索和查询。以下是关于 MySQL B-Tree 索引的简介:
孟斯特
2023/10/27
2700
B-Tree 索引简介
不懂就问,MySQL索引是啥?
索引是帮助数据库高效获取数据的一种数据结构,是基于数据表创建的,它包含了一个表中某些列的值以及记录对应的地址,并且把这些值存在一个数据结构中,常见的有使用哈希表、B+树作为索引。
唔仄lo咚锵
2022/05/08
1.3K0
不懂就问,MySQL索引是啥?
【MySQL】索引啊 d=====( ̄▽ ̄*)b
A database index is a data structure that improves the speed of operations in a table. Indexes can be created using one or more columns, providing the basis for both rapid random lookups and efficient ordering of access to records.
JuneBao
2022/10/26
1K0
【MySQL】索引啊 d=====( ̄▽ ̄*)b
【肝帝一周总结:全网最全最细】☀️Mysql 索引数据结构详解与索引优化☀️《❤️记得收藏❤️》
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储数据结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
苏州程序大白
2021/09/06
8600
深入理解四种数据库索引类型(- 唯一索引/非唯一索引 - 主键索引(主索引) - 聚集索引/非聚集索引 - 组合索引)唯一索引/非唯一索引主键索引(主索引)聚集索引/非聚集索引5.组合索引(联合索引)
1.唯一索引是在表上一个或者多个字段组合建立的索引,这个或者这些字段的值组合起来在表中不可以重复。
desperate633
2018/08/22
11.6K0
MySQL 联合索引底层存储结构及索引查找过程解读
👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.
Lorin 洛林
2023/11/20
2.9K0
MySQL 联合索引底层存储结构及索引查找过程解读
MySQL索引优化实战
众所周知,索引类似于字典的目录,可以提高查询的效率。 索引从物理上可以分为:聚集索引,非聚集索引 从逻辑上可以分为:普通索引,唯一索引,主键索引,联合索引,全文索引
Java识堂
2019/05/21
1.2K0
数据库性能优化-索引与sql相关优化
     索引是帮助MySQL高效获取数据的数据结构。索引是在存储引擎中实现的,所以每种存储引擎中的索引都不一样。如MYISAM和InnoDB存储引擎只支持BTree索引;MEMORY储存引擎可以支持HASH和BTREE索引。
洋仔聊编程
2019/01/15
1.9K0
MySQL索引原理
MySQL索引原理 MySQL 的索引 概述 索引是数据库中一个排序的数据结构,用来协助快速查询和更新数据库表中的数据;数据是以文件的形式存放在磁盘上的,每一行数据都有它的磁盘地址;当没有索引时,比如从 **500w** 条数据中检索出一条数据,只能依次遍历这张表的全部数据,直到找到这条数据。但是有了索引后,只需要在索引里去检索这条数据就可以了,因为它是一种专门进行数据检索特殊的数据结构,在找到数据存放的磁盘地址后就可以拿到数据。在 **InnoDB** 存储引擎中,索引有三类: 普通(**norm
编程之心
2021/07/14
4630
MySQL索引原理
推荐阅读
相关推荐
2021春招 | 一口气搞懂MySQL索引所有知识点
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验