MySQL复合索引
复合索引是指在数据库表上同时包含两个或更多列的索引。它们对于优化涉及这些列的查询非常有效,特别是当这些列常常在查询条件(如WHERE子句)、排序(ORDER BY子句)和连接(JOIN条件)中使用时。
复合索引生效的场景
-
最左前缀原则(Leftmost Prefix Rule):
如果查询条件使用了复合索引的最左边的列,则索引生效。例如,如果有一个复合索引(A, B, C),那么对于查询条件包含A、A和B、或A、B和C的查询,该索引都会被考虑使用。 -
索引覆盖查询(Covering Index):
如果一个查询的选择列完全由复合索引中的列组成,那么这个查询就是一个索引覆盖查询,复合索引将被用于直接返回结果,而不需要回表查询数据。 -
排序和分组操作:
如果ORDER BY或GROUP BY子句中的列与复合索引匹配,并且遵循索引的列顺序,那么这个索引可以用于优化排序和分组操作。
复合索引失效的场景
-
中间列跳跃:
如果查询条件跳过了复合索引中的中间列,索引可能不会被完全利用。例如,对于复合索引(A, B, C),如果查询条件只有A和C,而没有B,则这个索引只有部分生效。 -
不遵循索引顺序:
如果WHERE、ORDER BY或GROUP BY子句中的列顺序与复合索引中的列顺序不一致,索引可能不会被充分利用。 -
索引列用于计算:
和单列索引一样,如果索引列被用于计算或函数中,索引可能不会被使用。 -
使用范围查询:
对复合索引中的第一个列使用范围查询(如>、<、BETWEEN、LIKE 'prefix%')后,该列之后的索引列将不会被用于优化。
源码解析
在MySQL中,复合索引的使用由优化器根据查询的结构和统计信息来决定。这是在sql/optimizer/路径下的range_optimizer和sql_optimizer.cc文件中处理的。优化器会根据成本基准模型选择是否使用复合索引。
Java代码演示
以下是一个简单的Java代码示例,展示如何创建复合索引,以及如何编写一个可能触发索引失效的查询:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;public class CompositeIndexExample {public static void main(String[] args) {String jdbcUrl = "jdbc:mysql://localhost:3306/yourdatabase";String username = "yourusername";String password = "yourpassword";try (Connection connection = DriverManager.getConnection(jdbcUrl, username, password);Statement statement = connection.createStatement()) {// 创建复合索引String createIndexSQL = "CREATE INDEX idx_column1_column2 ON yourtable (column1, column2)";statement.execute(createIndexSQL);// 查询使用复合索引的最左前缀String queryWithLeftmostPrefix = "SELECT * FROM yourtable WHERE column1 = ?";// 查询跳过复合索引中的中间列String querySkippingIntermediateColumn = "SELECT * FROM yourtable WHERE column1 = ? AND column3 = ?";// 查询不遵循索引列顺序String queryNotFollowingIndexOrder = "SELECT * FROM yourtable WHERE column2 = ? AND column1 = ? ORDER BY column2, column1";// 上述查询中的PreparedStatement和ResultSet处理逻辑省略...} catch (Exception e) {e.printStackTrace();System.out.println("Error during database operation: " + e.getMessage());}}
}
在这个代码中,createIndexSQL创建了一个复合索引。接着,我们有三个查询示例:第一个是利用复合索引的最左前缀条件,这个查询可以高效利用索引;第二个示例查询跳过了中间列,可能导致索引的效率降低;第三个示例查询不遵循索引列的顺序,可能导致索引不被使用。
注意事项
- 使用
EXPLAIN语句或相应的数据库工具来分析查询是否利用了索引及其效率。 - 确保查询中使用的列与复合索引定义的顺序相匹配。
- 在设计复合索引时,要考虑查询模式和数据的选择性。
- 定期审查和调整索引,以适应数据和查询模式的变化。
通过理解索引的工作原理和生效场景,可以更好地设计和优化数据库索引,以提升应用程序的性能。
MySQL联合索引 复合索引(abc)如何索引命中规则实测
本地 MySQL版本 8.0.28
MySQL创建一张表,表名:‘test’
CREATE TABLE test (
id INT(11) NOT NULL AUTO_INCREMENT,
a INT(11) DEFAULT NULL,
b INT(11) DEFAULT NULL,
c INT(11) DEFAULT NULL,
d INT(11) DEFAULT NULL,
e INT(11) DEFAULT NULL,
PRIMARY KEY (id),
KEY index_abc (a,b,c)
);
我用代码往表中写入100万条数据
其中每行数据取值
a 范围 1 - 100000 随机整数
b 范围 1 - 100000 随机整数
c 范围 1 - 100000 随机整数
d 范围 1 - 100000 随机整数
e 范围 1 - 100000 随机整数
开始测试 联合索引(a,b,c)
使用 ‘EXPLAIN’ sql语句查看执行详情
EXPLAIN SELECT * FROM test WHERE a = 1 AND b = 1 AND c = 1;
结论(下面结论全部都实际测试过)
只要用到了最左侧a列,和顺序无关 都会使用 索引
a = 1 AND b = 2 AND c = 3 ; 使用索引
c = 1 AND b = 2 AND a = 3 ; 使用索引
a = 1 AND b = 2 ; 使用索引
a = 1 AND c = 3 ; 使用索引
c = 1 AND a = 2 ; 使用索引
不包含最左侧的 a 的不使用索引
c = 3 ; 未使用索引
b = 2 ; 未使用索引
b = 2 AND c = 3 ; 未使用索引
c = 1 AND b = 2 ; 未使用索引
OR 不使用索引
a = 1 AND b = 2 OR c = 3 未使用索引
a = 1 OR b = 2 AND c = 3 未使用索引
a = 1 OR b = 2 OR c = 3 未使用索引
最左侧的‘a’列 被大于,小于,不等于比较的 ,不一定使用索引.
看比较后结果集是否足够小.
测试时发现有时会使用索引,有时不会使用索引
我猜测这种情况和MySQL现在对索引的优化有关(有懂得大佬指导下哈)
数据a列取值是1-100000,似乎当a列被极小范围或足够小范围查询时是会使用索引的,当a列被比较小查询或取值范围较大时,MySQL就放弃了使用索引
a > 1时,确实不会使用索引,这里2-100000范围太大了
a < 2时,这里会使用索引,这里a取值是1-100000,<2范围就极小了,就是1了
a逐渐增大 a < 1000 ,a<2000,a<10000,a<14000;时都会使用索引.
但当 a < 15000时,就不再使用索引了.
同时a 大于某数时情况是同样的.
a > 1 这里没有使用索引 ( a > 1,等于2-100000)
a > 85000时,会开始使用索引
最左侧a=1,后面列大于小于无所谓,都使用索引(但后面必须 and and )
a = 1 AND b < 2 AND c = 3 使用索引
a = 1 AND c = 2 AND b < 3 使用索引
a = 1 AND b < 2 使用索引
a = 1 AND b <> 2 AND c = 3 使用索引
OR不使用索引
a = 1 AND b < 2 OR c = 2 未使用索引
相关文章:
MySQL复合索引
复合索引是指在数据库表上同时包含两个或更多列的索引。它们对于优化涉及这些列的查询非常有效,特别是当这些列常常在查询条件(如WHERE子句)、排序(ORDER BY子句)和连接(JOIN条件)中使用时。 复…...
Web3 游戏开发者的数据分析指南
作者:lesleyfootprint.network 在竞争激烈的 Web3 游戏行业中,成功不仅仅取决于游戏的发布,还需要在游戏运营过程中有高度的敏锐性,以应对下一次牛市的来临。 人们对 2024 年的游戏行业充满信心。A16Z GAMES 和 GAMES FUND ONE …...
temu跨境电商怎么样?做temu蓝海项目有哪些优势?
在全球电商市场激烈的竞争中,Temu跨境电商平台以其独特的优势和策略,逐渐崭露头角。对于许多想要拓展海外市场的商家来说,Temu的蓝海项目提供了一个充满机遇的新平台。本文将深入探讨Temu跨境电商的优势以及在蓝海市场中的发展前景。 全球化市…...
C#使用RabbitMQ-1_Docker部署并在c#中实现简单模式消息代理
介绍 RabbitMQ是一个开源的消息队列系统,实现了高级消息队列协议(AMQP)。 🍀RabbitMQ起源于金融系统,现在广泛应用于各种分布式系统中。它的主要功能是在应用程序之间提供异步消息传递,实现系统间的解耦和…...
EasyExcel中自定义拦截器的运用
在EasyExcel中自定义拦截器不仅可以帮助我们不止步于数据的填充,而且可以对样式、单元格合并等带来便捷的功能。下面直接开始 我们定义一个MergeWriteHandler的类继承AbstractMergeStrategy实现CellWriteHandler public class MergeLastWriteHandler extends Abst…...
shell编程-7
shell学习第7天 sed的学习1.sed是什么2.sed有两个空间pattern hold3.sed的语法4. sed里单引号和双引号的区别:5.sed的查找方式6.sed的命令sed的标签用法sed的a命令:追加sed的i命令:根据行号插入sed的c命令:整行替换sed的r命令sed的s命令:替换sed的d命令:删除sed中的&符号 7…...
工业智能网关储能物联网应用实现能源的高效利用及远程管理
储能电力物联网是指利用物联网技术和储能技术相结合,实现对电力系统中各种储能设备的智能管理和优化控制。随着可再生能源的不断发展和应用,电力系统面临着越来越大的电力调度和储能需求而储能电力物联网的出现可以有效解决这一问题,提高电力…...
虹科数字化与AR部门升级为安宝特AR子公司
致关心虹科AR的朋友们: 感谢您一直以来对虹科数字化与AR的支持和信任,为了更好地满足市场需求和公司发展的需要,虹科数字化与AR部门现已升级为虹科旗下独立子公司,并正式更名为“安宝特AR”。 ”虹科数字化与AR“自成立以来&…...
服务器是什么?(四种服务器类型)
服务器 服务器定义广义: 专门给其他机器提供服务的计算机。狭义:一台高性能的计算机,通过网络提供外部计算机一些业务服务 个人PC内存大概8G,服务器内存128G起步 服务器是什么 服务器指的是 网络中能对其他机器提供某些服务的计算机系统 ,相对…...
09-微服务Sentinel整合GateWay
一、概述 在微服务系统中,网关提供了微服务系统的统一入口,所以我们在做限流的时候,肯定是要在网关层面做一个流量的控制,Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。 1.1 总览 Sentinel 1.6.…...
python基础学习-03 安装
python3 可应用于多平台包括 Windows、Linux 和 Mac OS X。 Unix (Solaris, Linux, FreeBSD, AIX, HP/UX, SunOS, IRIX, 等等。)Win 9x/NT/2000Macintosh (Intel, PPC, 68K)OS/2DOS (多个DOS版本)PalmOSNokia 移动手机Windows CEAcorn/RISC OSBeOSAmigaVMS/OpenVMSQNXVxWorksP…...
HTML — 区块元素
HTML 通过各种标签将元素组合起来。 一. 区块元素 大多数 HTML 元素被定义为块级元素或内联元素。块级元素在浏览器显示时,通常会以新的行开始。例如:<div>、<h1>、<p>、<ul>等。 它们在使用时会独自占据一行,称为块…...
《PCI Express体系结构导读》随记 —— 第I篇 第3章 PCI总线的数据交换(4)
接前一篇文章:《PCI Express体系结构导读》随记 —— 第I篇 第3章 PCI总线的数据交换(3) 3.2 PCI设备的数据传递 PCI设备的数据传递使用地址译码方式,当一个存储器读写总线事务到达PCI总线时,在这条总线上的所有PCI设…...
力扣0083——删除排序链表中的重复元素
删除排序链表中的重复元素 难度:简单 题目描述 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 示例1 输入:head [1,1,2] 输出:[1,2]示例2 输入:…...
MySQL数据库的一些缩写含义
DDL Data Definition Language,数据定义语言,用来定义数据库对象(数据库,表,字段) DML DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进 行增、删、改操作。 添加数据&#x…...
解决 ssh: connect to host github.com port 22: Connection timed out
问题 今天使用git克隆github上的代码时,一直报错 原以为是公钥过期了,就尝试修改配置公钥,但是尝试了几次都不行,最终在博客上找到了解决方案,在次记录一下,以备不时之需 解决ssh-connect-to-host-github…...
【iOS ARKit】同时开启前后摄像头BlendShapes
在上一节中已经了解了 iOS ARkit 进行BlendShapes的基本操作,这一小节继续实践同时开启前后摄像头进行人脸捕捉和世界追踪。 iOS设备配备了前后两个摄像头,在运行AR 应用时,需要选择使用哪个摄像头作为图像输人。最常见的AR 体验使用设备后置…...
Vue3动态插入组件
一、使用<component>is实现动态组件插入 <component>:一个用于渲染动态组件或元素的“元组件”。 :is : 要渲染的实际组件,当 is 是字符串,它既可以是 HTML 标签名也可以是组件的注册名。 <script> import Foo from ./F…...
介绍一下OpenCV中常用的图像处理函数
OpenCV中常用的图像处理函数有很多,以下是其中一些函数的介绍: - cvLoadImage():读入图像函数。 - imshow():显示图像函数。 - imwrite():保存图像函数。 - Mat srcImage imread():读入图像函数。 - …...
vscode vim 快捷键汇总
需满足操作: 上下移动按照 word 移动选中增删改查找字符/变量移动、增加、复制、删除 行选中多个相同的变量/字符屏幕移动增加多个光标快速注释 上下左右移动 CommandDescription🔢 hleft (also: CTRL-H, BS, or Left key)🔢 lright (also…...
从概念到生产:使用快马AI生成企业级开yun微服务实战代码
今天想和大家分享一个实战经验:如何用InsCode(快马)平台快速搭建一个生产级可用的微服务项目。这个项目是一个产品目录服务,但重点不在于业务逻辑,而是如何集成企业开发中那些真正实用的技术栈。 项目骨架搭建 首先用Spring Initializr创建…...
告别重复劳动,用快马平台生成powershell脚本大幅提升数据处理效率
告别重复劳动,用快马平台生成powershell脚本大幅提升数据处理效率 最近接手了一个需要定期汇总销售数据的任务,每个月都要手动合并几十个Excel文件,然后计算各种统计指标。这种重复性工作不仅耗时耗力,还容易出错。直到发现了Ins…...
挖到宝!PFC2D 流固耦合常用案例合集,科研人速进
该模型是“PFC2D流固耦合常用案例合集”: 其中包括水力压裂、达西渗流等多个案例。 有需要学习和交流的伙伴可按需选取。 干货满满,是运用pfc5.0做流固耦合必不可少的科研学习资料性价比绝对超高 内容可编辑,觉得运行通畅 代码真实有效。最近…...
扩音器什么牌子音质好?领夹扩音器哪个品牌好性价比高?一次选对!
刚开始带课那几年,我对扩音器的重视程度其实不算高,更多精力都放在备课、安排课堂节奏和处理学生互动上。但课越上越多之后,我越来越清楚一件事:真正左右现场教学效率的,并不是板书有多整齐,也不是课件做得…...
MongoDB从零基础搭建到实战
MongoDB从零基础搭建到实战 MongoDB作为当下最流行的开源文档型NoSQL数据库,凭借灵活的文档结构、高扩展性和易用性,成为前后端开发、大数据存储、云原生项目的首选数据库之一。相比传统关系型数据库,它无需严格预定义表结构,适配…...
终极指南:如何用Fara-7B实现智能电脑自动操作
终极指南:如何用Fara-7B实现智能电脑自动操作 【免费下载链接】fara Fara-7B: An Efficient Agentic Model for Computer Use 项目地址: https://gitcode.com/gh_mirrors/fara/fara Fara-7B是微软推出的首个专门为电脑自动操作设计的7B参数智能代理模型&…...
复古玩法:OpenClaw+Qwen3.5-9B模拟操作Windows 98怀旧游戏
复古玩法:OpenClawQwen3.5-9B模拟操作Windows 98怀旧游戏 1. 为什么选择Windows 98游戏作为测试场景 最近在整理旧硬盘时,偶然发现了一批Windows 98时代的经典游戏安装包。这些20年前的老游戏不仅界面风格复古,操作方式也与现代软件大相径庭…...
启动 SAP Fiori Launchpad Designer:把 URL、scope、client 与排障思路一次讲透
在 SAP Fiori 项目里,很多团队花了不少时间做完前置配置,却在真正打开 Launchpad Designer 的那一刻卡住了:地址到底怎么拼?CONF 和 CUST 应该怎么选?为什么同一套内容在不同 client 里表现不一样?如果页面迟迟加载不出来,问题究竟出在 SAPUI5、ICF、OData,还是权限本身…...
一U多系统终极方案:用Ventoy管理ISO镜像+VMware验证的完整工作流
一U多系统终极方案:用Ventoy管理ISO镜像与VMware验证的完整工作流 在数字工具日益复杂的今天,系统管理员和技术爱好者常面临一个经典难题:如何高效管理多个操作系统镜像并确保其启动兼容性。传统方法需要反复格式化U盘或携带多个启动设备&am…...
Pixel Mind Decoder 命令行工具开发:使用Typora风格交互进行情绪随笔分析
Pixel Mind Decoder 命令行工具开发:使用Typora风格交互进行情绪随笔分析 1. 引言:当写作遇上情绪分析 你有没有过这样的体验?在Typora里奋笔疾书时,突然想知道这段文字传递出怎样的情绪色彩。作为一个经常用Markdown写作的人&a…...
