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操作,提升数据库系统的整体效率。然而,复合索引的设计需要仔细考虑列的顺序和查询模式,以确保索引能够充分发挥作用。在实际应用中,通过定期监控和优化,可以最大化复合索引的优势,确保数据库的高效运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/84061.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高并发下的缓存击穿/雪崩解决方案

有效解决缓存击穿和雪崩的方法包括:1. 使用互斥锁处理缓存击穿;2. 采用熔断器模式防止雪崩;3. 实施缓存预热和降级策略;4. 利用分片和多级缓存分散请求压力。这些方法各有优劣,需根据实际业务场景灵活调整和结合使用。…

【读论文】OpenAI o3与o4系统模型技术报告解读

回顾一下,4月16日,OpenAI发布了一份关于其o系列新模型——OpenAI o3和OpenAI o4-mini——的System Card。这份文档不仅揭示了这两款模型在推理能力和工具使用方面的显著进步,也详细阐述了其训练方法、数据来源、安全评估以及在图像理解生成、数学推理等多个核心领域的表现。…

第1课、LangChain 介绍

LangChain 介绍 LangChain 是一个以大语言模型(LLM, Large Language Model)为核心的开发框架,旨在帮助开发者高效地将如 GPT-4 等大型语言模型与外部数据源和计算资源集成,构建智能化应用。 1.1 工作原理 如上图所示&#xff…

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…

[论文阅读] 人工智能+软件工程(软件测试) | 当大语言模型遇上APP测试:SCENGEN如何让手机应用更靠谱

当大语言模型遇上APP测试:SCENGEN如何让手机应用更靠谱? 一、论文基础信息 论文标题:LLM-Guided Scenario-based GUI Testing(《大语言模型引导的基于场景的GUI测试》)作者及机构:Shengcheng Yu等&#x…

香橙派3B学习笔记7:snap安装管理软件包_打包程序与依赖

有时可以尝试把程文件与其依赖一块打包安装,这里就学习一下。 ssh : orangepi本地ip 密码 : orangepi 操作系统发行版: 基于 Ubuntu 20.04.6 LTS(Focal Fossa)的定制版本,专门为 Orange Pi 设备…

Playwright 测试框架 - .NET

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】

Model Context Protocol (MCP) 是一个前沿框架

微软发布了 Model Context Protocol (MCP) 课程:mcp-for-beginners。 Model Context Protocol (MCP) 是一个前沿框架,涵盖 C#、Java、JavaScript、TypeScript 和 Python 等主流编程语言,规范 AI 模型与客户端应用之间的交互。 MCP 课程结构 …

【量化】策略交易 - 均线策略(Moving Average Strategy)- 代码增强版本

策略交易 - 均线策略(Moving Average Strategy)- 代码增强版本 一、前言 本文主要是针对 【量化】策略交易 - 均线策略(Moving Average Strategy) 中的代码事例,进行逻辑的增强,添加了模拟买入和卖出逻辑&…

为什么要引入内联函数?

C 中引入内联函数主要有以下几个目的: 提高程序运行效率 - 普通函数调用会有一定的开销,如保存现场、传递参数、跳转到函数地址执行等。内联函数在编译时,会将函数体直接插入到调用处,避免了函数调用的开销,从而提高程…

C++.OpenGL (17/64)模型(Model)

模型(Model) 模型系统架构 #mermaid-svg-Zaji5BPdvnIkXIVg {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Zaji5BPdvnIkXIVg .error-icon{fill:#552222;}#mermaid-svg-Zaji5BPdvnIkXIVg .error-text{fill:#55222…

【Java学习笔记】System类

System 类 常用方法 方法描述System.exit()退出当前程序System.arraycopy(源数组,源数组起始索引,目标数组,目标数组起始索引,拷贝长度)复制数组元素,比较适合底层调用System.currentTimeMillis()返回当前时间距离 1…

因泰立科技H1X激光雷达:因泰立科技为智慧工业注入新动力

在当今工业领域,精准测量与高效作业是推动产业升级的关键因素。因泰立科技推出的H1X三维轮廓扫描激光雷达,凭借其卓越的性能和广泛的应用场景,正成为智慧工业中不可或缺的高科技装备。 产品简介 H1X三维轮廓扫描激光雷达是因泰立科技基于二维…

【threejs】每天一个小案例讲解:创建基本的3D场景

代码仓 GitHub - TiffanyHoo/three_practices: Learning three.js together! 可自行clone&#xff0c;无需安装依赖&#xff0c;直接liver-server运行/直接打开chapter01中的html文件 运行效果图 知识要点 核心运行代码 <!DOCTYPE html><html><head><t…

微软PowerBI考试 PL300-使用 Power BI 准备数据以供分析【提供练习数据】

微软PowerBI考试 PL300-使用 Power BI 准备数据以供分析 您将了解如何使用 Power Query 从不同的数据源中提取数据&#xff0c;选择存储模式和连接性类型。 您还将了解在对数据进行建模之前&#xff0c;如何分析、清理数据以及将数据加载到 Power BI 中。 在 Power BI 中获取…

Linux与Windows切换使用Obsidian,出现 unexplained changes 问题的解决

如果你的Obsidian文档在Linux与Windows间来回切换&#xff0c;可能会涉及到文件的保存换行符问题&#xff0c;但这样的话就容易导致一个问题&#xff0c;那就是内容无差异&#xff0c;Obsidian却提示unexplained changes&#xff0c;Windows系统下的解决方法如下&#xff0c;找…

Python爬虫-爬取各省份各年份高考分数线数据,进行数据分析

前言 本文是该专栏的第60篇,后面会持续分享python爬虫干货知识,记得关注。 本文,笔者将基于Python爬虫,爬取各省份历年以来的“各年份高考分数线”进行数据分析。 废话不多说,具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。接下来,跟着笔者直接往下看…

基于cornerstone3D的dicom影像浏览器 第三十章 心胸比例测量工具CTRTool

文章目录 前言一、实现过程1. 学习CobbAngleTool源码2. 新建CTRTool.js文件3. 重写constructor函数4. 重写defaultGetTextLines函数5. 增加_calculateLength函数6. 重写_calculateCachedStats函数7. 重写renderAnnotation函数 二、使用步骤1.引入库2. 添加到cornerstoneTools3.…

[嵌入式AI从0开始到入土]18_Ascend C算子开发环境(S5赛季)

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注&#xff1a;等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间&#xff0c;后期会考虑出视频教程&#xff0c;务必催更&#xff0c;以防我变身鸽王。 第1期 昇腾Altas 200 DK上手 第2期 下载昇腾案例并运行 第3期 官…

《前端面试题:JavaScript 闭包深度解析》

JavaScript 闭包深度解析&#xff1a;从原理到高级应用 一、闭包的本质与核心概念 闭包&#xff08;Closure&#xff09;是 JavaScript 中最强大且最常被误解的概念之一。理解闭包不仅是掌握 JavaScript 的关键&#xff0c;也是区分初级和高级开发者的重要标志。 1. 什么是闭…