当前位置: 首页 > article >正文

MySQL(56)什么是复合索引?

复合索引(Composite Index),也称为多列索引,是在数据库表的多列上创建的索引。它可以提高涉及多个列的查询性能,通过组合多个列的值来索引数据。复合索引特别适用于需要同时过滤多列的查询。

复合索引的优点

  1. 提高多列查询的性能:复合索引能够优化涉及多个列的查询。
  2. 支持多种查询模式:可以支持前缀列的多种组合查询。
  3. 减少索引的数量:相比于为每一列创建单独的索引,复合索引可以减少索引的数量和维护开销。

1. 示例表结构

假设有一个名为 employees 的表,用于存储员工信息:

CREATE TABLE employees (emp_id INT AUTO_INCREMENT PRIMARY KEY,emp_name VARCHAR(100),department_id INT,salary DECIMAL(10, 2),hire_date DATE
);

2. 创建复合索引

假设我们经常需要按 department_idsalary 查询员工数据:

SELECT emp_name, salary FROM employees WHERE department_id = 2 AND salary > 50000;

可以为 department_idsalary 列创建复合索引:

CREATE INDEX idx_dept_salary ON employees(department_id, salary);

3. 使用 EXPLAIN 验证复合索引

使用 EXPLAIN 分析查询的执行计划,验证是否使用了复合索引:

EXPLAIN SELECT emp_name, salary FROM employees WHERE department_id = 2 AND salary > 50000;

假设 EXPLAIN 的输出如下:

+----+-------------+----------+------------+-------+----------------+-------------+---------+------+------+----------+-------------+
| id | select_type | table    | partitions | type  | possible_keys  | key         | key_len | ref  | rows | filtered | Extra       |
+----+-------------+----------+------------+-------+----------------+-------------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | employees| NULL       | ref   | idx_dept_salary| idx_dept_salary| 8   | const| 100  |   100.00 | Using where |
+----+-------------+----------+------------+-------+----------------+-------------+---------+------+------+----------+-------------+

key 列中显示 idx_dept_salary 表示查询使用了复合索引。

4. 复合索引的使用规则

复合索引的顺序非常重要,因为查询优化器会根据索引列的顺序来利用索引。我们需要理解以下几种情况:

示例查询1:完全匹配索引的前缀

查询使用索引的前缀列:

SELECT emp_name, salary FROM employees WHERE department_id = 2;

这查询只使用了复合索引的第一个列 department_id,仍然可以利用复合索引。

示例查询2:匹配索引的所有列

查询使用了所有的索引列:

SELECT emp_name, salary FROM employees WHERE department_id = 2 AND salary > 50000;

这种查询可以完全利用复合索引。

示例查询3:不匹配索引的前缀

查询不使用索引的前缀列:

SELECT emp_name, salary FROM employees WHERE salary > 50000;

这种查询无法利用复合索引,因为 department_id 是索引的前缀,但查询中并未使用。

5. 复合索引的局限性

尽管复合索引可以显著提高查询性能,但它们也有一些局限性:

  1. 索引顺序重要:复合索引的列顺序会影响查询的性能,选择不当可能无法充分利用索引。
  2. 增加写操作的开销:插入、更新、删除操作需要维护更多的索引,增加了写操作的开销。
  3. 占用更多存储空间:复合索引会占用更多的磁盘空间。

6. 复合索引的最佳实践

  1. 合理选择列顺序:将选择性高的列放在复合索引的前面,以最大化查询性能。
  2. 考虑查询模式:根据常见的查询模式设计复合索引,以确保查询能够利用索引。
  3. 监控和优化:使用 EXPLAIN 分析查询性能,确保查询优化器选择适当的索引。

7. 复合索引的高级示例

假设我们有一个更复杂的查询需求,涉及多个列的组合:

SELECT emp_name, salary FROM employees WHERE department_id = 2 AND salary > 50000 AND hire_date > '2023-01-01';

可以为 department_idsalaryhire_date 列创建复合索引:

CREATE INDEX idx_dept_salary_date ON employees(department_id, salary, hire_date);

使用 EXPLAIN 分析这个查询的执行计划:

EXPLAIN SELECT emp_name, salary FROM employees WHERE department_id = 2 AND salary > 50000 AND hire_date > '2023-01-01';

假设 EXPLAIN 的输出如下:

+----+-------------+----------+------------+-------+-------------------+-------------------+---------+-------+------+----------+-------------+
| id | select_type | table    | partitions | type  | possible_keys     | key               | key_len | ref   | rows | filtered | Extra       |
+----+-------------+----------+------------+-------+-------------------+-------------------+---------+-------+------+----------+-------------+
|  1 | SIMPLE      | employees| NULL       | ref   | idx_dept_salary_date | idx_dept_salary_date | 12    | const | 100  |   100.00 | Using where |
+----+-------------+----------+------------+-------+-------------------+-------------------+---------+-------+------+----------+-------------+

key 列中显示 idx_dept_salary_date 表示查询使用了复合索引,优化了查询性能。

小结

复合索引是数据库优化中非常强大的工具,特别适用于多列查询和复杂查询模式。通过合理设计和使用复合索引,可以显著提高查询性能,减少I/O操作,提升数据库系统的整体效率。然而,复合索引的设计需要仔细考虑列的顺序和查询模式,以确保索引能够充分发挥作用。在实际应用中,通过定期监控和优化,可以最大化复合索引的优势,确保数据库的高效运行。

相关文章:

MySQL(56)什么是复合索引?

复合索引(Composite Index),也称为多列索引,是在数据库表的多列上创建的索引。它可以提高涉及多个列的查询性能,通过组合多个列的值来索引数据。复合索引特别适用于需要同时过滤多列的查询。 复合索引的优点 提高多列…...

Rust学习(1)

声明:学习来源于 《Rust 圣经》 变量的绑定和解构 变量绑定 let a "hello world":这个过程称之为变量绑定。绑定就是把这个对象绑定给一个变量,让这个变量成为它的主人。 变量可变性 Rust 变量默认情况下不可变,可以通过 mut …...

鸿蒙仓颉语言开发实战教程:商城应用个人中心页面

又到了高考的日子,幽蓝君在这里祝各位考生朋友冷静答题,超常发挥。 今天要分享的内容是仓颉语言商城应用的个人中心页面,先看效果图: 下面介绍下这个页面的实现过程。 我们可以先分析下整个页面的布局结构。可以看出它是纵向的布…...

vue3 eslint ts 关闭多单词命名检查

无效做法 import { globalIgnores } from eslint/config import {defineConfigWithVueTs,vueTsConfigs, } from vue/eslint-config-typescript import pluginVue from eslint-plugin-vue import skipFormatting from vue/eslint-config-prettier/skip-formatting// To allow m…...

横向对比npm和yarn

🔧 基本概况 维度npmYarn所属Node.js 官方工具(npm, Inc.)Meta(Facebook)主导开发初始发布时间2010 年2016 年(为了解决 npm 的一些痛点而诞生)默认安装Node.js 安装后自带需要手动安装最新版本…...

智能生成完整 Java 后端架构,告别手动编写 ControllerServiceDao

在 Java 后端开发的漫长征途上,开发者们常常深陷繁琐的基础代码编写泥潭。尤其是 Controller、Service、Dao 这三层代码的手动编写,堪称开发效率的 “拦路虎”。从搭建项目骨架到填充业务逻辑,每一个环节都需要开发者投入大量精力&#xff0c…...

Python----目标检测(yolov5-7.0安装及训练细胞)

一、下载项目代码 yolov5代码源 GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite yolov5-7.0代码源 Release v7.0 - YOLOv5 SOTA Realtime Instance Segmentation ultralytics/yolov5 GitHub 二、创建虚拟环境 创建一个3.8…...

MySQL EXPLAIN 命令详解

文章目录 MySQL EXPLAIN 命令详解EXPLAIN 输出的基本结构id2. select_type3. table4. partitions5. type6. possible_keys7. key8. key_len9. ref10. rows11. filtered12. Extra 使用 EXPLAIN 的注意事项示例 MySQL EXPLAIN 命令详解 EXPLAIN 是 MySQL 中一个非常有用的命令&a…...

【Linux】文件赋权(指定文件所有者、所属组)、挂载光驱(图文教程)

文章目录 文件赋权创建文件 testChmod查看文件的当前权限使用 chmod 命令修改权限验证权限关键命令总结答案汇总 光驱挂载确认文件是否存在打包压缩压缩验证创建 work 目录将压缩文件复制到 work 目录新建挂载点 /MNT/CDROM 并挂载光驱答案汇总 更多相关内容可查看 此篇用以解决…...

第22讲、Odoo18 QWeb 模板引擎详解

Odoo QWeb 模板引擎详解与实战 Odoo 的 QWeb 是其自研的模板引擎,广泛应用于 HTML、XML、PDF 等内容的生成,支撑了前端页面渲染、报表输出、门户页面、邮件模板等多种场景。本文将系统介绍 QWeb 的核心用法、工作原理,并通过实战案例演示如何…...

OpenJudge | 大整数乘法

总时间限制: 1000ms 内存限制: 65536kB 描述 求两个不超过200位的非负整数的积。 输入 有两行,每行是一个不超过200位的非负整数,没有多余的前导0。 输出 一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342&am…...

【原理解析】为什么显示器Fliker dB值越大,闪烁程度越轻?

显示器Fliker 1 显示器闪烁现象说明2 Fliker量测方法2.1 FMA法2.2 JEITA法问题答疑:为什么显示器Fliker dB值越大,闪烁程度越轻? 3 参考文献 1 显示器闪烁现象说明 当一个光源闪烁超过每秒10次以上就可在人眼中产生视觉残留,此时…...

Bootstrap Table开源的企业级数据表格集成

Bootstrap Table 是什么 ‌Bootstrap Table 是一个基于 Bootstrap 框架的开源插件,专为快速构建功能丰富、响应式的数据表格而设计。‌ 它支持排序、分页、搜索、导出等核心功能,并兼容多种 CSS 框架(如 Semantic UI、Material Design 等&am…...

JDK8新特性之Steam流

这里写目录标题 一、Stream流概述1.1、传统写法1.2、Stream写法1.3、Stream流操作分类 二、Stream流获取方式2.1、根据Collection获取2.2、通过Stream的of方法 三、Stream常用方法介绍3.1、forEach3.2、count3.3、filter3.4、limit3.5、skip3.6、map3.7、sorted3.8、distinct3.…...

vue3表格使用Switch 开关

本示例基于vue3 element-plus 注&#xff1a;表格数据返回状态值为0、1。开关使用 v-model"scope.row.state 0" 会报错 故需要对写法做些修改&#xff0c;效果图如下 <el-table-column prop"state" label"入学状态" width"180" …...

【11408学习记录】考研写作双核引擎:感谢信+建议信复合结构高分模板(附16年真题精讲)

感谢信建议信 英语写作2016年考研英语&#xff08;二&#xff09;真题小作文题目分析写作思路第一段第二段锦囊妙句9&#xff1a;锦囊妙句12&#xff1a;锦囊妙句13&#xff1a;锦囊妙句18&#xff1a; 第三段 妙句成文 每日一句词汇第一步&#xff1a;找谓语第二步&#xff1a…...

一套个人知识储备库构建方案

写文章的初心是做知识沉淀。 好记性不如烂笔头&#xff0c;将阶段性的经验总结成文章&#xff0c;下次遇到相同的问题时&#xff0c;查起来比再次去搜集资料快得多。 然而&#xff0c;当文章越来越多时&#xff0c;有一个问题逐渐开始变得“严峻”起来。 比如&#xff0c;我…...

行李箱检测数据集VOC+YOLO格式2083张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2083 标注数量(xml文件个数)&#xff1a;2083 标注数量(txt文件个数)&#xff1a;2083 …...

QT进阶之路:带命名空间的自定义控件在Qt设计器与qss中的使用技巧

文章目录 0.前言1.带命名空间Qt自定义类在QT设计器中的使用技巧1.1 定义一个带命令空间QLabel自定义类1.2 在QT设计器中引入自定义控件类 2.带命名空间Qt自定义类在qss中的使用技巧2.1 命名空间在 QSS 中的特殊语法2.1 在QSS中定义带命名空间的样式 3.在项目中使用带命名空间的…...

矩阵详解:从基础概念到实际应用

矩阵详解&#xff1a;从基础概念到实际应用 目录 矩阵的基本概念矩阵的类型矩阵运算特殊矩阵矩阵的逆与伴随矩阵的秩与等价分块矩阵矩阵的应用 矩阵知识体系思维导图 mindmaproot((矩阵))基本概念定义mn数表元素aij矩阵记号基本术语行数和列数方阵与非方阵矩阵相等矩阵类型…...

Prompt工程学习之自我一致性

自我一致性 &#xff08;Self-consistency&#xff09; 概念&#xff1a;该技术通过对同一问题采样不同的推理路径&#xff0c;并通过多数投票选择最一致的答案&#xff0c;来解决大语言模型&#xff08;LLM&#xff09;输出的可变性问题。通过使用不同的温度&#xff08;temp…...

实践提炼,EtherNet/IP转PROFINET网关实现乳企数字化工厂增效

乳企数字化工厂的核心技术应用 1. 智能质检&#xff1a;机器视觉协议网关的协同 液态奶包装线&#xff08;利乐罐装&#xff09;的漏码检测生产线&#xff0c;其高速产线&#xff08;20,000包/小时&#xff09;需实时识别微小缺陷&#xff0c;但视觉系统&#xff08;康耐视Ca…...

从以物换物到DeFi:交易的演变与Arbitrum的DeFi生态

交易的本质&#xff1a;从以物换物到现代金融 交易是人类社会经济活动的核心&#xff0c;是通过交换资源&#xff08;如货物、服务或货币&#xff09;满足各方需求的行为。其本质是价值交换&#xff0c;旨在实现资源的优化配置。交易的历史可以追溯到人类文明的起源&#xff0…...

一文掌握 Tombola 抽象基类的自动化子类测试策略

深入解析 Python 抽象基类的自动化测试框架设计 在 Python 开发中&#xff0c;抽象基类&#xff08;ABC&#xff09;是定义接口规范的强大工具。本文将以 Tombola 抽象基类为例&#xff0c;详细解析其子类的自动化测试框架设计&#xff0c;展示如何通过 Python 的内省机制实现…...

vue.js not detected解决方法

如果你在开发环境中遇到“Vue.js not detected”的错误&#xff0c;这通常意味着你的项目没有正确设置或者配置以识别Vue.js。下面是一些解决这个问题的步骤&#xff1a; 1. 确认Vue.js已正确安装 首先&#xff0c;确保你的项目中已经正确安装了Vue.js。你可以通过以下命令来…...

Redis 知识点一

参考 Redis - 常见缓存问题 - 知乎 Redis的缓存更新策略 - Sherlock先生 - 博客园 三种缓存策略&#xff1a;Cache Aside 策略、Read/Write Through 策略、Write Back 策略-CSDN博客 1.缓存问题 1.1.缓存穿透 大量请求未命中缓存&#xff0c;直接访问数据库。 解决办法&…...

分类场景数据集大全「包含数据标注+训练脚本」 (持续原地更新)

一、作者介绍&#xff1a;六年算法开发经验、AI 算法经理、阿里云专家博主。擅长&#xff1a;检测、分割、理解、大模型 等算法训练与推理部署任务。 二、数据集介绍&#xff1a; 质量高&#xff1a;高质量图片、高质量标注数据&#xff0c;吐血标注、整理&#xff0c;可以作为…...

数据结构与算法——二叉树高频题目(1)

前言&#xff1a; 简单记录一下自己学习算法的历程&#xff0c;主要根据左老师自己的视频课进行&#xff0c;由于大部分课程涉及题目较多&#xff0c;所以分文章进行记录。 本文将简单记录一下二叉树的层序遍历和 Z 形层次遍历。 参考视频&#xff1a; 算法讲解036【必备】…...

Web后端开发(SpringBootWeb、HTTP、Tomcat快速入门)

目录 SpringBootWeb入门 Spring 需求&#xff1a; 步骤&#xff1a; HTTP协议&#xff1a; 概述&#xff1a; 请求协议&#xff1a; 响应协议&#xff1a; 协议解析&#xff1a; Web服务器-Tomcat&#xff1a; 简介&#xff1a; 基本使用&#xff1a; SpringBootWeb…...

CppCon 2015 学习:Memory and C++ debugging at Electronic Arts

这是关于 C 游戏开发中内存接口与调试工具演进 的介绍&#xff0c;主要回顾了从早期到现在平台上的内存与调试策略变化&#xff1a; 游戏平台演进与内存接口编程风格 2000年 (PlayStation 2) 编程风格偏向嵌入式 C 风格。系统资源有限&#xff08;例如 32MB RAM&#xff09;…...