MySQL索引是数据库中用于提高数据检索效率的重要技术。它通过在数据表列上创建索引结构,如B+Tree、Hash索引等,加速查询速度。索引类型包括主键索引、唯一索引、普通索引、全文索引、空间索引等,各适用于不同的查询场景。合理设计索引可以显著提升数据库性能,但过多索引也会导致维护成本增加和写操作变慢。索引优化需考虑查询模式、数据量和存储引擎特性。
肖哥弹架构 跟大家“弹弹” 代码设计技巧,需要代码关注
欢迎 点赞,关注,评论。
关注公号Solomon肖哥弹架构获取更多精彩内容
历史热点文章
- 数据库:全文索引实现技巧,架构师是这样实现的
- myqsl 12种锁,提供12个真实业务与流程图,轻松掌握运用场景与方式
- 数据库我是这样写出来的,Java MVCC升级版1,持续更新
- 数据库我是这样写出来的,Java版本1,持续更新
- 打破僵局:深度解析数据库死锁的策略与实践(专家篇)
- 架构师通过合作式锁定协议——保证数据库底层持久化的安全方案
1. B+Tree索引
B+Tree索引是MySQL中最常用的索引类型,适用于快速定位、顺序访问和范围查询。
构建原理:基于B+Tree数据结构,节点包含数据键值和子节点指针,叶子节点包含数据记录或指针。
设计目标:快速数据访问,支持顺序和范围查询。
业务场景:电商平台商品信息检索。
- 场景表结构:
- 场景索引代码:
- 索引不起作用条件:
2. Hash索引
Hash索引通过哈希函数快速定位键值,适合等值查询,不适合范围查询
构建原理:基于哈希表,快速定位键值。
设计目标:快速等值查询。
业务场景:用户登录系统,快速验证用户名或邮箱。
- 场景表结构:
- 场景索引代码:
- 索引不起作用条件:
3. Full-Text索引
全文索引用于文本字段的高效搜索,支持复杂的查询语句。
构建原理:基于倒排索引,用于全文检索。
设计目标:优化全文搜索效率。
业务场景:文章内容搜索。
- 场景表结构:
- 场景索引代码:
- 索引不起作用条件:
4. 主键索引(PRIMARY KEY)
主键索引确保数据表中每条记录的唯一性,通常是B+Tree索引
构建原理:自动在主键上创建的B+Tree索引。
设计目标:唯一标识表中的每一行。
业务场景:用户账户信息管理。
- 场景表结构:
- 场景索引代码:
- 索引不起作用条件:
5. 唯一索引(UNIQUE)
唯一索引保证键值的唯一性,允许有空值
构建原理:基于B+Tree,不允许重复键值。
设计目标:保证列值的唯一性。
业务场景:确保用户邮箱地址的唯一性。
- 场景表结构:
- 场景索引代码:
- 索引不起作用条件:
6. 普通索引(INDEX)
普通索引用于加速查询,没有唯一性约束。
构建原理:基于B+Tree,允许键值重复。
设计目标:提高普通查询的效率。
业务场景:订单状态查询。
- 场景表结构:
- 场景索引代码:
- 索引不起作用条件:
7. 联合索引(Composite Index)
联合索引跨多个列,提高多条件查询效率。
构建原理:跨多个列的B+Tree索引。
设计目标:提高多列查询的效率。
业务场景:按日期和用户ID查询交易记录。
- 场景表结构:
- 场景索引代码:
- 索引不起作用条件:
8. 空间索引(Spatial Index)
空间索引用于地理空间数据,优化区域查询
构建原理:基于R-Tree,用于空间数据索引。
设计目标:优化空间数据查询效率。
业务场景:地理信息系统中地点检索。
- 场景表结构:
- 场景索引代码:
- 索引不起作用条件:
9. 前缀索引
前缀索引只对字符串的一部分创建索引,节省空间。
构建原理:对字符串列的前缀部分创建索引,以减少索引占用的空间。
设计目标:在列前缀足够唯一的情况下,优化查询性能,节省存储空间。
业务场景:存储大量URL或长文本数据,需要快速检索。
- 场景表结构:
- 场景索引代码:
- 索引不起作用条件:
10. 聚簇索引(Clustered Index)
聚簇索引的叶子节点直接包含数据行,提高范围查询效率。
构建原理:行数据存储在B+Tree的叶子节点,非叶子节点包含键值和指向子节点的指针。
设计目标:数据物理存储顺序与索引顺序一致,提高范围查询效率。
业务场景:按主键查询或插入数据,如用户ID。
- 场景表结构:
- 场景索引代码:
- 索引不起作用条件:
11. 非聚簇索引(Non-clustered Index)
非聚簇索引的叶子节点包含指向数据行的指针。
构建原理:索引和数据物理存储分离,索引包含键值和指向数据行的指针。
设计目标:提供快速的索引查找,然后通过指针回表查询数据。
业务场景:查询非主键列,如商品分类。
- 场景表结构:
- 场景索引代码:
- 索引不起作用条件:
12. 自适应哈希索引
InnoDB存储引擎根据查询模式自动创建哈希索引以加速查询
构建原理:InnoDB自动在热点B+Tree索引上创建Hash索引,以加速等值查询。
设计目标:自动优化频繁等值查询的性能。
业务场景:频繁查询的列,如用户表的用户名。
- 场景表结构:
- 场景索引代码:
- 索引不起作用条件:
13. 覆盖索引(Index-Only Scan)
覆盖索引包含查询所需的所有字段,查询无需访问数据行。
构建原理:索引包含查询所需的所有列,查询可以直接从索引中获取数据。
设计目标:避免访问主表数据,直接从索引中读取所需数据。
业务场景:查询只需要索引列,如获取商品名称和价格。
- 场景表结构:
- 场景索引代码:
- 索引不起作用条件:
14. 部分索引(Partial Index)
部分索引只对满足特定条件的记录创建索引。
构建原理:基于表中满足特定条件的行创建索引。
设计目标:优化特定条件下的查询性能。
业务场景:只对活跃用户创建索引,查询活跃用户信息。
- 场景表结构:
- 场景索引代码:
- 索引不起作用条件:
15. 函数索引(Functional Index)
函数索引基于列值的函数结果创建,优化特定函数查询。
构建原理:基于列值的函数结果创建索引。
设计目标:优化基于列值函数结果的查询。
业务场景:基于用户邮箱的特定格式处理后的查询。
- 场景表结构:
- 场景索引代码:
- 索引不起作用条件:
16. 索引分区
索引分区将大型索引分割为多个分区,提高索引管理查询效率。
构建原理:将大型索引分割成多个更小的分区,以提高索引的管理和查询效率。
设计目标:优化大型表的索引性能。
业务场景:大型订单数据表,按年份分区索引。
- 场景表结构:
- 场景索引代码:
- 索引不起作用条件:
17. 外键索引(Foreign Key Index)
外键索引确保数据的引用完整性,通常由外键约束自动创建。
构建原理:基于外键列创建索引,保证数据的引用完整性。
设计目标:确保外键列的唯一性或唯一性组合,加速外键关联查询。
业务场景:订单表和用户表之间的外键关系。
- 场景表结构:
- 场景索引代码:
- 索引不起作用条件: