首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01 | 基础架构:一条SQL查询语句是如何执行的?
02 | 日志系统:一条SQL更新语句是如何执行的?
03 | 事务隔离:为什么你改了我还看不见?
04 | 深入浅出索引(上)
05 | 深入浅出索引(下)
06 | 全局锁和表锁 :给表加个字段怎么有这么多阻碍?
07 | 行锁功过:怎么减少行锁对性能的影响?
08 | 事务到底是隔离的还是不隔离的?
09 | 普通索引和唯一索引,应该怎么选择?
10 | MySQL为什么有时候会选错索引?
11 | 怎么给字符串字段加索引?
12 | 为什么我的MySQL会“抖”一下?
13 | 为什么表数据删掉一半,表文件大小不变?
14 | count(*)这么慢,我该怎么办?
15 | 答疑文章(一):日志和索引相关问题
16 | “order by”是怎么工作的?
17 | 如何正确地显示随机消息?
18 | 为什么这些SQL语句逻辑相同,性能却差异巨大?
19 | 为什么我只查一行的语句,也执行这么慢?
20 | 幻读是什么,幻读有什么问题?
21 | 为什么我只改一行的语句,锁这么多?
22 | MySQL有哪些“饮鸩止渴”提高性能的方法?
23 | MySQL是怎么保证数据不丢的?
24 | MySQL是怎么保证主备一致的?
25 | MySQL是怎么保证高可用的?
26 | 备库为什么会延迟好几个小时?
27 | 主库出问题了,从库怎么办?
28 | 读写分离有哪些坑?
29 | 如何判断一个数据库是不是出问题了?
30 | 答疑文章(二):用动态的观点看加锁
31 | 误删数据后除了跑路,还能怎么办?
32 | 为什么还有kill不掉的语句?
33 | 我查这么多数据,会不会把数据库内存打爆?
34 | 到底可不可以使用join?
35 | join语句怎么优化?
36 | 为什么临时表可以重名?
37 | 什么时候会使用内部临时表?
38 | 都说InnoDB好,那还要不要使用Memory引擎?
39 | 自增主键为什么不是连续的?
40 | insert语句的锁为什么这么多?
41 | 怎么最快地复制一张表?
42 | grant之后要跟着flush privileges吗?
43 | 要不要使用分区表?
44 | 答疑文章(三):说一说这些好问题
45 | 自增id用完怎么办?
当前位置:
首页>>
技术小册>>
MySQL 实战 45 讲
小册名称:MySQL 实战 45 讲
### 09 | 普通索引和唯一索引,应该怎么选择? 在数据库设计和优化中,索引是提高查询效率、加速数据检索的关键手段。MySQL支持多种类型的索引,其中普通索引(也称为非唯一索引)和唯一索引是最基础且最常用的两种。正确理解和选择这两种索引对于优化数据库性能至关重要。本章节将深入探讨普通索引与唯一索引的区别、应用场景、选择原则及其实践中的考量因素。 #### 一、普通索引与唯一索引的定义与区别 **1.1 定义** - **普通索引**:允许索引列包含重复的值,主要用于提高查询效率。在表中创建普通索引后,数据库系统会自动维护一个索引的数据结构,以便快速定位到表中的记录。 - **唯一索引**:保证索引列的所有值都是唯一的,不允许出现重复。除了加速查询外,唯一索引还能确保数据的唯一性。在创建唯一索引时,如果表中已存在重复值,则索引创建会失败。 **1.2 区别** - **唯一性**:唯一索引要求索引列的值必须唯一,而普通索引则没有这个限制。 - **性能影响**:虽然两者都能提高查询效率,但唯一索引在数据插入、更新时需要进行唯一性校验,因此可能会比普通索引稍微慢一些,但这种差异在大多数情况下是微不足道的。 - **应用场景**:普通索引适用于大多数需要加速查询但不要求数据唯一性的场景;而唯一索引则特别适用于需要保证数据唯一性的场景,如用户ID、邮箱地址等。 #### 二、选择原则 **2.1 根据业务需求选择** - **唯一性需求**:如果业务上要求某列的值必须唯一,那么应该选择唯一索引。这不仅能保证数据的唯一性,还能通过索引加速查询。 - **查询优化**:如果仅是为了提高查询效率而不关心数据的唯一性,那么可以选择普通索引。 **2.2 考虑性能影响** - **插入/更新性能**:虽然唯一索引在插入和更新时需要进行唯一性校验,但在大多数场景下,这种性能影响是可以接受的。然而,在高频写入的场景下,如果担心性能问题,可以通过评估数据重复的可能性、表的大小以及索引的维护成本来权衡是否使用唯一索引。 - **查询效率**:无论是普通索引还是唯一索引,都能显著提高查询效率。但在数据量极大、查询条件复杂的情况下,合理设计索引结构(包括选择合适的索引类型和索引列)显得尤为重要。 **2.3 索引维护成本** - **空间占用**:索引本身会占用一定的存储空间,尤其是在数据量大的情况下。唯一索引和普通索引在空间占用上的差异主要体现在索引值的重复度上,但通常这种差异不会成为选择索引类型的决定性因素。 - **维护开销**:数据库系统会定期自动维护索引,包括合并碎片、重建索引等。唯一索引由于需要进行唯一性校验,其维护开销可能会略高于普通索引。然而,这种开销在大多数情况下是可以忽略不计的。 **2.4 并发与锁** - **并发性能**:在高并发环境下,唯一索引可能会因为锁的竞争而影响性能。当多个事务尝试插入或更新具有相同索引值的记录时,数据库需要通过锁来保证数据的一致性。此时,唯一索引可能会导致锁等待时间延长,从而影响性能。因此,在高并发场景下,需要根据实际情况评估是否使用唯一索引。 #### 三、实践中的考量因素 **3.1 数据一致性** - 唯一索引是确保数据一致性的重要手段之一。在需要保证数据唯一性的场景中,如用户注册时的邮箱地址、用户名等,使用唯一索引可以有效防止重复数据的出现。 **3.2 索引覆盖扫描** - 在某些情况下,如果查询语句能够完全利用索引中的列来返回所需数据(即索引覆盖扫描),那么查询性能将得到极大提升。无论是普通索引还是唯一索引,都可以通过合理设计索引列来实现索引覆盖扫描。 **3.3 复合索引的考量** - 当表中需要基于多个列进行查询时,可以考虑创建复合索引。在选择复合索引的列顺序时,需要综合考虑查询频率、过滤效果(即哪些列能够更有效地减少结果集的大小)以及是否包含唯一列。如果复合索引中包含唯一列,那么该索引也可以视为一种特殊类型的唯一索引。 **3.4 索引的创建与维护** - 在创建索引时,应谨慎选择索引类型和索引列。过多的索引会占用大量存储空间并增加维护成本;而过少的索引则可能导致查询性能低下。因此,需要根据实际业务需求和数据访问模式来制定合理的索引策略。 - 索引的维护也是不可忽视的一环。随着数据的增长和更新,索引可能会变得碎片化,从而影响性能。此时,可以通过重建索引、优化表结构等方式来维护索引的健康状态。 #### 四、总结 普通索引和唯一索引各有其适用场景和优缺点。在选择时,应根据业务需求、性能影响、索引维护成本以及并发性能等因素进行综合考虑。正确选择和使用索引是优化数据库性能的重要手段之一。通过合理设计索引策略和定期维护索引健康状态,可以显著提高数据库的查询效率和数据一致性保障能力。
上一篇:
08 | 事务到底是隔离的还是不隔离的?
下一篇:
10 | MySQL为什么有时候会选错索引?
该分类下的相关小册推荐:
MySQL从入门到精通(三)
MySQL从入门到精通(二)
MySQL从入门到精通(一)
MySQL8.0入门与实践
细说MySQL(零基础到高级应用)
SQL零基础到熟练应用(增删改查)
MySQL必会核心问题
MySQL从入门到精通(五)
MySQL从入门到精通(四)