MySQL-索引:聚集索引、覆盖索引、组合索引、前缀索引、唯一索引(附带例子解释)

MySQL-索引:聚集索引、覆盖索引、组合索引、前缀索引、唯一索引(附带例子解释)

      • 1、聚集索引
      • 2、覆盖索引
      • 3、组合索引
      • 4、前缀索引
      • 5、唯一索引
      • 6、再深入理解覆盖索引
      • 7、拓展

1、聚集索引

  • 在数据库中,聚集索引决定了表数据行的物理存储顺序。在InnoDB存储引擎中,每个表都有一个聚簇索引
  • 聚集索引的叶子节点直接包含行记录的数据(主键值和列数据),因此对于查询来说,如果查询条件命中了聚集索引,可以直接从索引树找到所需的数据无需回表操作。
  • 一个表只能有一个聚集索引,并且通常建议选择那些具有唯一性、访问频繁且高度排序的列作为聚集索引

假设我们有一个用户表users,其中包含以下字段

CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT, -- 假设这是主键username VARCHAR(50),email VARCHAR(255),created_at TIMESTAMP
);

InnoDB存储引擎中,默认情况下id作为聚集索引。这意味着表中的行是按id的升序物理存储的,并且每个叶子节点包含了完整的行数据(包括username, email, created_at)。当你执行如下查询时,可以直接利用聚集索引来快速定位到指定id的数据行

SELECT * FROM users WHERE id = 123;

2、覆盖索引

  • 覆盖索引是指在查询过程中,只需要通过索引就能获取到所有需要的数据,而不需要再回到表中去查找行记录,这样可以减少磁盘I/O,显著提高查询性能
  • 如果一个查询语句所涉及的所有字段都出现在某个索引中,那么这个索引就被称作覆盖索引不仅包括查询列,还包括结果集中所需的其他列如在SELECT列表中的列

对于上述users表,如果我们创建了一个包含所有查询列的复合索引:

CREATE INDEX idx_username_email ON users (username, email);

现在执行如下查询:

SELECT username, email FROM users WHERE username = 'Alice';

这个查询可以完全使用索引 idx_username_email 来完成,因为索引包含了查询所需的所有列无需回表获取其他列数据,这就是一个覆盖索引的例子。

3、组合索引

同样以上述的idx_username_email为例,它是一个基于username和email两个列创建的组合索引。当执行如下的查询时,由于遵循了最左前缀原则,可以有效利用该索引:

-- 可以利用索引
SELECT * FROM users WHERE username = 'Bob' AND email LIKE '%example.com';-- 不会利用索引(仅使用了索引的一部分)
SELECT * FROM users WHERE email LIKE '%example.com';

4、前缀索引

考虑一个文章表articles,其内容字段content非常大:

CREATE TABLE articles (id INT PRIMARY KEY AUTO_INCREMENT,title VARCHAR(255),content TEXT
);

为了减少索引空间占用并加速对title列的模糊查询,我们可以只对title的前几个字符创建前缀索引:

CREATE INDEX idx_title_prefix ON articles (SUBSTR(title, 1, 10));

这样,在执行如下查询时就可以利用前缀索引进行优化:

SELECT * FROM articles WHERE title LIKE 'Introduction%';

5、唯一索引

在users表中,id列已经是一个主键,自动带有唯一约束。如果还需要确保邮箱地址的唯一性,可以添加一个唯一索引:

ALTER TABLE users ADD UNIQUE INDEX idx_unique_email (email);

此时,尝试插入重复邮箱地址的记录将会失败:

INSERT INTO users (username, email) VALUES ('Charlie', 'charlie@example.com');
INSERT INTO users (username, email) VALUES ('David', 'charlie@example.com'); -- 这条语句将抛出违反唯一约束的错误

6、再深入理解覆盖索引

假设我们有一个销售订单表orders,包含以下字段:

CREATE TABLE orders (order_id INT PRIMARY KEY AUTO_INCREMENT,customer_id INT,product_id INT,order_date DATE,quantity INT,price DECIMAL(10,2)
);

为了优化如下的查询性能,我们可以创建一个覆盖索引:

SELECT customer_id, product_id, SUM(quantity) as total_quantity 
FROM orders 
WHERE order_date BETWEEN '2021-01-01' AND '2021-12-31'
GROUP BY customer_id, product_id;

这个查询需要检索在指定日期范围内的所有订单,并按客户ID和产品ID进行分组并计算数量总和。为了使这个查询能使用覆盖索引,我们需要创建一个包括order_date, customer_id, product_id以及quantity的索引

CREATE INDEX idx_covering ON orders (order_date, customer_id, product_id, quantity);

现在,当执行上述查询时,MySQL可以直接从索引idx_covering中获取到所需的所有数据(customer_id, product_id, quantity),而不需要访问实际的数据行,从而显著提高了查询效率。这就是覆盖索引的应用实例。

7、拓展

索引对WHERE子句中的列名起作用,同时也可以在SELECT子句中发挥作用。但具体情况取决于索引的类型和查询的执行计划。

1)对WHERE条件中的列名起作用:
当SQL查询语句包含WHERE子句时,如果该子句涉及的列有索引,数据库系统可以根据索引快速定位到符合条件的数据行,从而减少磁盘I/O和扫描的数据量,显著提升查询性能
例如:

   SELECT * FROM orders WHERE order_id = 123;

如果order_id上有索引,那么这个查询可以迅速定位到特定记录。
2)对SELECT子句中的列名间接起作用(覆盖索引):
如果创建了一个覆盖索引,即索引包含了查询所需要的所有列,那么数据库在执行查询时无需回表获取其他列数据,直接从索引中获取结果,这种情况下索引也对SELECT子句起到了优化效果
例如:

   CREATE INDEX idx_orders ON orders (order_date, customer_id);SELECT customer_id FROM orders WHERE order_date BETWEEN '2021-01-01' AND '2021-12-31';

在这个例子中,虽然我们是从SELECT子句中选择customer_id,但由于idx_orders索引已经包含了查询所需的order_date和customer_id字段,因此能够通过索引来完成整个查询过程,实现所谓的“覆盖索引”。
总之,索引主要用于提高WHERE子句中条件过滤的速度,并且在满足特定条件的情况下,也能有效优化SELECT子句所涉及的列的查询效率

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

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

相关文章

Linux:修改文件权限

简介 在Linux系统中,权限管理是文件和目录安全性的核心。文件权限是非常重要的,它们决定了哪些用户可以读取、写入或执行文件。 文件权限 用户类别 每个文件和目录都与三种类型的权限相关联,分别针对三个不同的用户类别: 所有…

【Redis | 第二篇】Redis的五种数据类型和相关命令

文章目录 2.Redis的数据类型和相关命令2.1常用数据类型2.2特性和用途2.2.1字符串(String)2.2.2哈希(Hash)2.2.3列表(List)2.2.4集合(Set)2.2.5有序集合(Sorted Set&#…

将组件直接绑定到vue实例上面的写法

怎么将组件直接绑定到vue实例上面? 在实际开发过程中,有多种使用vue组件的方式,有在组件中引入,直接挂载到vue进行全局使用,也有直接挂载到vue实例上面当成vue的一个属性来使用的。下面通过代码来实现将组件直接绑定到…

SwiftUI中stroke属性的使用

在 SwiftUI 中,可以使用 stroke 属性来绘制形状的轮廓线。stroke 属性接受一个 Color 类型的参数,指定轮廓线的颜色。 以下是一个示例代码,演示如何在 SwiftUI 中使用 stroke 属性绘制矩形的轮廓线: import SwiftUIstruct Conte…

linux小记(1)

基本概念:不依靠扩展名来区分文件类型 好处:除了文本文件其他所有windows文件都无法在Linux下运行,包括病毒木马。 坏处:所有的软件都需要对linux单独开发 习惯用后缀来区分文件,方便管理。 -压缩包:*.…

第十五届蓝桥杯软件赛模拟赛第三期(c++,python,java通用)

注:1.填空题用最简单的方式(暴力递归或枚举)得出答案即可。 2.编程题若无思路可用暴力递归或枚举也能拿到不少的分数。 第一题 【问题描述】 请问 2023 有多少个约数?即有多少个正整数,使得 2023 是这个正整数的整数倍…

【ESP32 IDF】UART串口

文章目录 前言一、数据传输的基本概念1.1 串行与并行通信1.2 单工/半双工/全双工通信1.3 同步/异步通信1.4 波特率1.5 UART 四要素 二、串口的使用2.1 配置UART串口2.2 配置UART引脚2.3 安装串口驱动2.4 获取环形缓冲区的数据长度2.5 读取数据2.6 发送数据 总结 前言 UART&…

第十二篇:学习python数据清洗

文章目录 一、啥是数据清洗二、将表格数据导入pandas中1. 准备工作2. 引入csv文件2.1 引入pandas库2.2 读取文件/修改名称3.2 快速浏览数据2.4 修改名字2.5 查找缺失值2.6 删除缺失值 3. 引入Excel文件3.1 引入pandas库3.2 读取Excel文件的人均GDP数据3.3 查看数据类型和non-nu…

Android中的几种定位方式调用详解

目前,移动端大致通过三种方式来进行设备定位:GPS、基站、wifi。本文就详细的讲解一下这几种定位方式和实现方法。 前言 android中我们一般使用LocationManager来获取位置信息,这里面有四中provider: public static final Strin…

怎样获取html网页中<ul >中的数据?

您可以使用Python中的BeautifulSoup库来获取HTML网页中<ul>标签中的数据。以下是一个示例代码&#xff1a; rom bs4 import BeautifulSoup import requests# 发送HTTP请求并获取网页内容 url "http://example.com" # 替换为目标网页的URL response request…

YOLOv8从入门到入土使用教程!(一)训练模型

⭐⭐⭐瞧一瞧看一看&#xff0c;新鲜的YOLOv9魔改专栏来啦&#xff01;⭐⭐⭐ 专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、本文介绍 本文将演示如何使用YOLOv8进行训练及预测&#xff01; 二…

线性dp 最长公共子序列(二分版本)

本题由于1e5的数据&#xff0c;n方的做法不再适用&#xff0c;但是简单的一维并不能满足动态转移。这时&#xff0c;我们就可以考虑引入最长上升子序列来处理 用样例来看 5 序列&#xff1a;3 2 1 4 5序号&#xff1a;1 2 3 4 5序列&#xff1a;1 2 3 4 5序号&#xff1a;3 2…

1.1 Java 注解(Annotation)

1.1 注解&#xff08;Annotation&#xff09; 1.1.1 什么是注解 注解的定义&#xff1a;它提供了一种安全的类似注释的机制&#xff0c;用来将任何信息或元数据&#xff08;metadata&#xff09;与程序元素&#xff08;类、方法、成员变量等&#xff09;进行关联。为程序的元…

九型人格测试,2号人格助人型的职业分析

九型人格测试中的助人型&#xff0c;也叫二号人格&#xff0c;解读专业选择和职业选择。 助人型人格&#xff0c;在九型人格中&#xff0c;被视作一种给予者&#xff0c;他们总是喜欢帮助别人&#xff0c;有一个观念&#xff1a;“我不帮助别人&#xff0c;就没有人愿意喜欢我…

透明玻璃屏幕为什么那么贵

透明玻璃屏幕之所以价格较高&#xff0c;主要是由于以下几个方面的原因&#xff1a; 技术研发与创新&#xff1a;透明玻璃屏幕作为一种先进的显示技术&#xff0c;其研发和制造过程涉及到许多复杂的技术。这些技术的研发和创新需要投入大量的资金和时间。此外&#xff0c;透明玻…

鸿蒙应用native开发入门以及运行native项目报错spawn EPERM问题解决以及so包调用

目录 DevEco Studio新建native项目 新建第一个native项目 解决spawn EPERM报错 点击运行 分析流程

无冬之夜:增强版 Neverwinter Nights Mac 激活版

Neverwinter Nights是一款角色扮演游戏。游戏的剧情发生在虚构的城市Neverwinter&#xff0c;玩家扮演一个冒险者&#xff0c;在这个城市中探索并完成各种任务。游戏中有许多不同的职业、种族、技能和法术可供玩家选择。游戏的主要特点包括多人游戏模式、自定义模块和工具包&am…

【Mc生存】插火把

【Mc生存】插火把 题目描述 话说有一天 linyorson 在“我的世界”开了一个 n n n \times n nn 的方阵&#xff0c;现在他有 m m m 个火把和 k k k 个萤石&#xff0c;分别放在 ( x 1 , y 1 ) ∼ ( x m , y m ) (x_1, y_1) \sim (x_m, y_m) (x1​,y1​)∼(xm​,ym​) 和 …

【书生·浦语大模型实战营】第5节 课后作业

LMDeploy 的量化和部署 0. 课程链接1. 课后作业1.1 基础作业1.2 进阶作业&#xff08;可选做&#xff09; 0. 课程链接 链接&#xff1a;https://github.com/InternLM/tutorial/blob/main/lmdeploy/lmdeploy.md 1. 课后作业 1.1 基础作业 使用 LMDeploy 以本地对话、网页Gra…

大模型技术在测试领域应用的方向思考

方向1&#xff1a;利用大模型技术生成测试用例 方向2&#xff1a;利用大模型技术进行测试用例推荐 如何利用大模型技术生成测试用例 大模型技术&#xff0c;如自然语言处理&#xff08;NLP&#xff09;中的大型预训练模型&#xff0c;如BERT、GPT等&#xff0c;已经在许多领…