Multiple-Column Indexes

本文涉及的产品
PolarSearch,搜索节点 4核8GB
RDS AI 助手,专业版
PolarDB Agent Express,2核4GB
简介: MySQL 支持创建复合索引(多列索引),最多由 16 列组成,适用于查询中所有或部分列的查找。复合索引如同排序数组,通过连接索引列值创建。正确排列的单个复合索引能加速多种查询。若索引列非最左侧前缀,MySQL 无法使用索引查找。此外,还可引入基于其他列信息“哈希”的列作为替代方案,提高查询效率。

MySQL可以创建复合索引(即多列上的索引)。索引最多可由16列组成。对于某些数据类型,您可以为列的前缀建立索引。
MySQL可以将多列索引用于测试索引中所有列的查询,也可以用于仅测试第一列、前两列、前三列等的查询。如果在索引定义中按正确的顺序指定列,则单个复合索引可以加速同一表上的多种查询。
多列索引可以被视为一个排序数组,其行包含通过连接索引列的值而创建的值。

作为复合索引的替代方案,您可以引入一个基于其他列的信息“哈希”的列。如果此列很短,具有合理的唯一性,并且有索引,那么它可能比许多列上的“宽”索引更快。在MySQL中,很容易使用这个额外的列:
image.png

假设一个表具有以下规格:
image.png

名称索引是last_name和first_name列上的索引。该索引可用于查询中的查找,这些查询指定了last_name和first_name值组合的已知范围内的值。它也可以用于仅指定last_name值的查询,因为该列是索引的最左侧前缀(如本节稍后所述)。因此,名称索引用于以下查询中的查找:

image.png

但是,名称索引不用于以下查询中的查找:

image.png

假设您发出以下SELECT语句:

image.png

834/10000
实时翻译
划译
如果col1和col2上存在多列索引,则可以直接获取相应的行。如果col1和col2上存在单独的单列索引,优化器会尝试使用索引合并优化(见第8.2.1.3节“索引合并优化”),或者尝试通过决定哪个索引排除更多行并使用该索引来获取行,从而找到限制性最强的索引。
如果表具有多列索引,则优化器可以使用索引的任何最左侧前缀来查找行。例如,如果你在(col1,col2,col3)上有一个三列索引,那么你在(coll1)、(col1、col2)和(col1)、col2、col3上都有索引搜索功能。
如果列不构成索引的最左侧前缀,MySQL就无法使用索引执行查找。假设您有如下所示的SELECT语句:

image.png

如果(col1,col2,col3)上存在索引,则只有前两个查询使用该索引。第三和第四个查询确实涉及索引列,但不使用索引来执行查找,因为(col2)和(col2,col3)不是(col1,col2,col3)的最左侧前缀。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
IDE 开发工具
【开发IDE升级】如何对IDEA版本进行升级
本文介绍了如何将 IntelliJ IDEA Ultimate 从 2020.2.2 版本升级到 2022.3.2 版本。主要内容包括准备工作、卸载旧版本和安装新版本的步骤。首先,从官网下载所需版本并备份旧版配置;接着,通过 Uninstall.exe 卸载旧版,保留配置和插件;最后,安装新版并完成激活。详细的操作步骤和截图帮助用户顺利完成升级过程。
18301 1
【开发IDE升级】如何对IDEA版本进行升级
|
SQL 关系型数据库 Linux
Postgres SQL 做备份脚本批处理
每次手动备份太麻烦了,工作上需要,决定使用自动备份,所以写个博客来记录一次,本次备份功能是无密码通过批处理来执行定时备份的,如果是windows server r2服务器的话大家可以搭配任务计划程序来做定时执行,如果是linux内核的系统可以用crontab插件,crontab 插件大家可以自行百度,从而形成定时备份数据。
521 0
|
存储 JavaScript 前端开发
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
1894 2
|
Android开发
Intellij idea 代码提示忽略字母大小写和常用快捷键及设置
Intellij idea 代码提示忽略字母大小写和常用快捷键及设置
5222 0
Intellij idea 代码提示忽略字母大小写和常用快捷键及设置
|
安全 Java Maven
MapStruct使用教程2024(高级版)
MapStruct使用教程2024(高级版)
|
XML Java 应用服务中间件
深度解析SpringBoot内嵌Web容器
今天分享一个SpringBoot的内嵌Web容器,在SpringBoot还没有出现时,我们使用Java开发了Web项目,需要将其部署到Tomcat下面,需要配置很多xml文件,SpringBoot出现后,就从繁琐的xml文件中解脱出来了,SpringBoot将Web容器进行了内嵌,我们只需要将项目打成一个jar包,就可以运行了,大大省略了开发成本,那么SpringBoot是怎么实现的呢,我们今天就来详细介绍。
1064 2
|
SQL 存储 编解码
你会测试 登录 吗?
你会测试 登录 吗?
448 0
你会测试 登录 吗?
|
JSON Java API
Spring Boot 中的 @RestController 注解是什么,原理,如何使用
Spring Boot 中的 @RestController 注解是什么,原理,如何使用
|
应用服务中间件 nginx
【Nginx异常】Nginx启动一闪而过没反应,Nginx双击打开后,没有启动成功,也没有进程,且127.0.0.1:8080访问不到
【Nginx异常】Nginx启动一闪而过没反应,Nginx双击打开后,没有启动成功,也没有进程,且127.0.0.1:8080访问不到
6990 1
|
开发工具 数据安全/隐私保护 git
sentry 服务的搭建(上)
sentry 服务的搭建(上)
952 0