MySQL 的联合索引的特点

devtools/2024/10/27 23:22:58/

        MySQL 的联合索引(又称复合索引)是指在一个索引中包含多个列,允许在这些列上同时进行查询优化。使用联合索引有助于提升多列查询的性能,但其运作机制具有一些独特的特点:

1. 遵循最左前缀匹配原则

联合索引在使用时,遵循最左前缀匹配原则。也就是说,查询语句中使用的列必须从索引的最左边开始,依次匹配索引中的列,才能有效地利用索引。

  • 如果你创建了一个 (A, B, C) 的联合索引,MySQL 可以使用以下组合来加速查询:
    • (A)
    • (A, B)
    • (A, B, C)
  • 但不能直接使用索引的中间或右侧列,比如 (B) 或 (C),否则索引不会被使用或只能部分使用。

2. 索引顺序对查询有影响

        联合索引中列的顺序非常重要,因为 MySQL 会根据查询条件从左至右使用索引。如果查询条件未从最左列开始,索引将无法被有效利用。例如:

  • 对于 (A, B, C) 的联合索引,查询 WHERE B = 1 AND C = 2 无法使用该索引,但 WHERE A = 1 AND C = 2 可以部分使用索引(会根据 A 进行过滤)。

3. 可以覆盖查询

        如果一个查询的所有列都在联合索引中,并且查询的列只包括这些索引中的列,那么 MySQL 可以通过联合索引直接返回结果,而不需要回表查询。这种情况称为覆盖索引,能够极大地提升查询性能。

        例如,对于联合索引 (A, B, C),查询 SELECT A, B FROM table WHERE A = 1 AND B = 2 可以直接从索引中获取结果,而不需要回表查询。

4. 提高多列条件查询的效率

联合索引特别适合用于多列的查询条件。如果一个查询涉及多列,且这些列恰好在联合索引中,MySQL 能够同时利用这些列来加速查询。例如,WHERE A = 1 AND B = 2 使用 (A, B) 联合索引时,会同时利用 A 和 B 列来进行过滤和排序。

5. 索引排序(ORDER BY)的使用

        联合索引可以帮助优化 ORDER BY 操作,但同样遵循最左前缀原则。如果 ORDER BY 使用的列和索引的最左列顺序一致,MySQL 可以通过索引直接返回排序好的结果,避免额外的排序操作。

例如:

  • 联合索引 (A, B, C),查询 SELECT * FROM table WHERE A = 1 ORDER BY B, C 可以利用索引来完成排序。
  • 但如果 ORDER BY C 而不涉及 A 和 B,索引无法优化排序。

6. 查询范围条件的影响

        在联合索引中,一旦某个列使用了范围查询(如 ><BETWEENLIKE 'xx%' 等),其后的列将无法继续使用索引。例如:

  • 对于 (A, B, C) 联合索引,如果查询条件是 A = 1 AND B > 2 AND C = 3,索引只能用到 A 和 B,无法继续用于 C 列。

7. 选择性较高的列放在前面

        为了充分利用索引的效率,通常将选择性较高的列(即值较为唯一的列)放在联合索引的前面。选择性高的列能够更快地过滤数据,减少查询的扫描范围。例如,在 (A, B) 联合索引中,如果 A 列的值种类多,选择性高,应将其放在索引的前面。

8. 避免冗余索引

        如果已经存在一个 (A, B) 的联合索引,则无需再单独为 A 列创建索引,因为联合索引的最左前缀原则已经能够覆盖 A 列的查询需求。


小结:

MySQL 联合索引的特点可以总结为:

  • 最左前缀原则:从最左列开始匹配。
  • 索引顺序重要:查询和排序需要匹配索引列的顺序。
  • 可以实现覆盖索引,避免回表查询。
  • 提高多列查询效率,尤其是遵循联合索引的顺序。
  • 范围查询会限制后续列的索引使用

http://www.ppmy.cn/devtools/129290.html

相关文章

FineReport 分栏报表

将报表中的数据根据所需要的展示的样式将数据进行分栏展示列分栏 报表中数据是横向扩展的,超过一页的数据会显示在下一页,而每页下面会有很大的一片空白区域,不美观且浪费纸张。希望在一页中第一行扩展满后自动到下一行继续扩展 1、新建数据集 SELECT * FROM 公司股票2、内…

如何通过视频建立3d模型

通过视频建立3D模型通常包括几个关键步骤&#xff1a;从视频中提取帧、对帧中的物体进行特征提取、将多帧中的信息结合起来恢复三维结构。Python中有一些库和工具可以帮助实现这个过程&#xff0c;例如OpenCV、Open3D、COLMAP等。以下是一个简化的流程和代码框架&#xff1a; 步…

Python数据分析——Numpy

纯个人python的一个小回忆笔记&#xff0c;当时假期花两天学的python&#xff0c;确实时隔几个月快忘光了&#xff0c;为了应付作业才回忆起来&#xff0c;不涉及太多基础&#xff0c;适用于有一定编程基础的参考回忆。 这一篇笔记来源于下面哔哩哔哩up主的视频&#xff1a; 一…

Sql执行较慢的排查方式

SQL执行较慢的排查方式涉及多个方面&#xff0c;包括检查SQL语句本身、数据库配置、硬件资源等。以下是一些具体的排查步骤和优化建议&#xff1a; 一、检查SQL语句 启用慢查询日志&#xff1a; 大多数数据库管理系统&#xff08;如MySQL、PostgreSQL&#xff09;都支持慢查询…

Konva 组,层级

代码&#xff1a; <template><div class"rect"><div class"header"> <!-- <el-button type"primary" click"show">展示</el-button>--> <!-- <el-button type"success&quo…

flask基于python的动漫插画分享网站django毕业设计项目

目录 具体实现截图技术栈预期达到的目标开发技术介绍论文大纲目 录编码规范核心代码部分展示其他项目推荐详细视频演示源码获取方式 具体实现截图 技术栈 Python也提供了数据库的操作接口&#xff0c;通过引入Python的MySQL处理对象连接数据库后&#xff0c;使用通用的SQL语句…

字符串使用方法:

字符串: -- 拼接字符串 SELECT CONCAT(糯米,啊啊啊撒,删掉); -- 字符长度 SELECT LENGTH(asssssssggg); -- 转大写 SELECT UPPER(asdf); -- 转小写 SELECT LOWER(ASDFG); -- 去除左边空格 SELECT LTRIM( aaaasdrf ); -- 去除右边空格 SELECT RTRIM( aaaasdff ); -- 去除两端…

Redis 事务 总结

前言 相关系列 《Redis & 目录》&#xff08;持续更新&#xff09;《Redis & 事务 & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Redis & 事务 & 总结》&#xff08;学习总结/最新最准/持续更新&#xff09;《Redis & 事务…