MySQL索引的概念与好处

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 本文介绍了MySQL存储引擎及其索引类型,重点对比了MyISAM与InnoDB引擎的不同之处。文中详细解释了InnoDB引擎的自适应Hash索引及聚簇索引的特点,并阐述了索引的重要性及使用原因,包括提升数据检索速度、实现数据唯一性等。最后,文章还讨论了主键索引的选择与页分裂问题,并提供了使用自增字段作为主键的建议。

初识引擎

在讲述索引之前,我们需要认识MySQL的存储引擎。目前,MySQL的存储引擎共有MyISAM 、InnoDB、Memory三种,其中,InnoDB在MySQL5.5后成为默认引擎,也就是说,我们后面所讲述的引擎都是基于InnoDB引擎的。三者所支持的索引类型有所不同,但都实现了B+树索引

索引类型 InnoDB引擎 MyISAM引擎 Memory引擎
B+ 树 支持 支持 支持
Hash索引 不支持 不支持 支持
FullText索引 支持 支持 不支持

可以看到MyISAM引擎与InnoDB引擎有很大相似处,但是两者所实现的方式还是有所不同的。

MyISAM引擎与InnoDB引擎在实现上的不同

  1. Hash索引上,虽然两者都不支持Hash索引,但是InnoDB引擎支持的Hash索引是自适应的,不支持人工生成Hash索引,但是会根据表的使用情况自动为表生成哈希索引,使InnoDB能够在具有适当的工作负载和足够的缓冲池内存的系统上执行更像内存中的数据库,而不牺牲事务特性或可靠性,从而提升效能。而MyISAM则不支持 2.在MyISAM中,B+Tree叶节点的data域存放的是数据记录的地址,被称为“非聚簇索引”;而InnoDB引擎中,树的节点data域保存了完整的数据记录,而其余的索引的data域则存储相应记录主键的值,被称为“聚簇索引”。

了解了存储引擎后,下面我们继续讲索引

索引的概念

索引可以形象为一本书的目录,通过这个目录我们可以较快的找到目标数据的位置,避免全表扫描。显而易见的,索引能快速定位并找到目标数据的位置。但是,假如我们更新了某条数据,那么索引也会随之改变,从而带来性能上的影响,所以,索引能有效提升数据检索,但也会占用内存并消耗性能。

为什么要使用索引?

索引虽然带来内存的消耗,但也有诸多好处

  1. InnoDB引擎会根据优先级选择某个唯一性索引为聚簇索引的索引键,实现每一行数据的唯一性。
  2. 索引按自己编排的顺序,能够将随机IO变为顺序IO,从而提升性能
  3. 加速表和表之间的连接,实现数据的完整性
  4. 明显加快数据的检索速度,适当的建立索引能有效避免回表

聚簇索引的索引键如何选择

在创建表时,InnoDB 存储引擎会根据以下优先级选择

  1. 首先会使用主键作为聚簇索引的索引键(key)
  2. 如果没有主键,则会选择第一个不包含 NULL 值的唯一列
  3. 在上述条件都不满足的情况下,InnoDB 将自动生成一个隐式自增 id 列 所以,这也就是我们为什么必须在建表时指定主键索引的原因

为什么主键索引这么重要

首先,MySQL使用B+Tree树作为索引的数据结构,为什么选择B+Tree作为索引的数据结构,我们将在下期展开叙述。数据在B+tree上的存储大致为,数据全存储在叶子节点上,同时,在大量数据面前,数据也大概分为3-4层,大致与下面结构相似。

假如我们查询主键id为6的数据时,大概会经历下面3个阶段

  1. 在在一层中 6介于1到10之间,找到下一层数据为 1,4,7
  2. 在第二层中 6介于4到7之间, 找到下一层为 4到7
  3. 在第三层中 找到主键为6的行数据

经过3次读取节点,最终找到主键值为6的行数据。从中我们可以看出,同一个叶子节点内的各个数据是按主键顺序存放的,因此,每当有一条新的数据插入时,数据库会根据主键将其插入到对应的叶子节点中。 所以,主键索引应保持其自增性,这样就可以顺序插入新的值。如果主键不是顺序的,那么可能会插入到现有数据的中间,从而导致后面的数据也不得不重新移动,如果当前页是满的,就会发生页分裂

页分裂

在已满的数据页中(数据页的内存一般为16k),如果根据主键id要在中间插入一条新的行数据,此时数据页已经满了,于是,会选择位置将数据页分为两页,并将位置之后的数据转移到新的数据页中。而旧的数据页会产生随之而来的存储空间浪费。于是,最好用自增字段做主键。

小结

本期主要讲述了索引的概念以及优缺点,同时也讲述了在InnoDB引擎下聚簇索引的索引键如何选择,下期将讲述索引的分类以及使用,并且在索引建立上的建议。


转载来源:https://juejin.cn/post/7291546618683637819

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5天前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
42 9
|
1月前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
159 66
|
9天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
50 18
|
2天前
|
存储 Oracle 关系型数据库
索引在手,查询无忧:MySQL索引简介
MySQL 是一款广泛使用的关系型数据库管理系统,在2024年5月的DB-Engines排名中得分1084,仅次于Oracle。本文介绍MySQL索引的工作原理和类型,包括B+Tree、Hash、Full-text索引,以及主键、唯一、普通索引等,帮助开发者优化查询性能。索引类似于图书馆的分类系统,能快速定位数据行,极大提高检索效率。
24 8
|
8天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
17 7
|
7天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化与慢查询优化:原理与实践
通过本文的介绍,希望您能够深入理解MySQL索引优化与慢查询优化的原理和实践方法,并在实际项目中灵活运用这些技术,提升数据库的整体性能。
27 5
|
11天前
|
存储 关系型数据库 MySQL
Mysql索引:深入理解InnoDb聚集索引与MyisAm非聚集索引
通过本文的介绍,希望您能深入理解InnoDB聚集索引与MyISAM非聚集索引的概念、结构和应用场景,从而在实际工作中灵活运用这些知识,优化数据库性能。
62 7
|
27天前
|
关系型数据库 MySQL Java
MySQL索引优化与Java应用实践
【11月更文挑战第25天】在大数据量和高并发的业务场景下,MySQL数据库的索引优化是提升查询性能的关键。本文将深入探讨MySQL索引的多种类型、优化策略及其在Java应用中的实践,通过历史背景、业务场景、底层原理的介绍,并结合Java示例代码,帮助Java架构师更好地理解并应用这些技术。
26 2
|
1月前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
251 1
|
1月前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
104 0

推荐镜像

更多
下一篇
DataWorks