Skip to content

索引结构的分类?

约 846 字大约 3 分钟

MySQL小米

2025-03-24

⭐ 题目日期:

小米 - 2024/12/26

📝 题解:


索引结构的分类

索引结构可以根据多个维度进行分类,以下是主要的分类方式及其具体类型:


1. 按数据结构分类

类型特点适用场景
B树/B+树- B树:平衡多路搜索树,支持范围查询。
- B+树:叶子节点通过指针连接,范围查询更高效,适合磁盘存储。
通用数据库(如MySQL InnoDB主键索引)。
哈希索引- 基于哈希表,支持O(1)等值查询。
- 不支持范围查询和排序。
内存数据库(如Redis)、等值查询优化。
LSM树- 日志结构合并树,写优化型结构,通过追加写入和后台合并提高写入性能。高写入场景(如LevelDB、RocksDB)。
位图索引- 用位图表示数据的存在性,适合低基数(唯一值少)的列。数据仓库、OLAP分析(如Oracle)。
全文索引- 基于倒排索引,支持关键词搜索和模糊匹配。文本搜索(如Elasticsearch、MySQL全文索引)。
空间索引- 使用R树或四叉树等结构,支持地理空间数据查询。地理信息系统(如PostGIS)。

2. 按应用场景分类

类型特点示例
主键索引- 唯一标识每行数据,表必须有一个主键(显式或隐式)。
- 通常是聚集索引(如InnoDB)。
PRIMARY KEY (id)
唯一索引- 确保某列值唯一,允许NULL值。UNIQUE INDEX (email)
组合索引- 基于多列构建,支持多条件查询优化。
- 遵循最左前缀原则。
INDEX (name, age)
覆盖索引- 索引包含查询所需的所有字段,避免回表。SELECT id FROM table WHERE name='Alice'(若索引为(name, id)

3. 按存储方式分类

类型特点示例
聚集索引(Clustered Index)- 数据行的物理存储顺序与索引一致,一个表只能有一个聚集索引。
- 通常为主键索引。
InnoDB的主键索引。
非聚集索引(Non-clustered Index)- 索引与数据分离,通过指针定位数据。
- 需回表查询。
MySQL的普通二级索引。

4. 按数据特性分类

类型特点适用场景
稠密索引- 每个数据记录都有对应的索引条目,查询快但占用空间大。内存充足且需快速查询的场景。
稀疏索引- 仅部分记录有索引条目,节省空间但需遍历查找。数据按顺序存储且查询范围较小的场景。

5. 按实现层次分类

类型特点示例
内存索引- 索引完全驻留内存,读写速度快,但容量受限。Redis的哈希索引、Memcached。
磁盘索引- 索引存储在磁盘,支持大数据量,但访问速度较慢。MySQL的InnoDB B+树索引。

总结

  • 核心选择依据:根据数据量、查询模式(等值/范围)、写入频率、存储介质(内存/磁盘)选择合适的索引结构。
  • 常见组合
    • OLTP系统:B+树(主键/二级索引)+ 哈希索引(缓存)。
    • OLAP系统:位图索引 + 列式存储。
    • 全文搜索:倒排索引 + 分词优化。
  • 优化建议:避免过度索引(写性能下降),定期分析索引使用情况(如MySQL的EXPLAIN)。