外观
索引结构的分类?
⭐ 题目日期:
小米 - 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
)。