聚簇索引(Clustered Index)和非聚簇索引(Non-Clustered Index)以及B树和B+树,它们各自有不同的特点和适用场景。
在mysql中,常用搜索引擎支持的索引(结构都为b+树):
InnoDB:支持聚簇索引,也支持非聚簇索引
MyISAM:支持非聚簇索引
特性/方面 | InnoDB | MyISAM |
---|---|---|
数据存储位置 | 支持行存储和页存储,数据和索引一起存储 | 仅支持表存储,数据和索引分离存储 |
锁机制 | 支持行级锁,适合高并发写入场景 | 仅支持表级锁,适合读多写少的场景 |
事务支持 | 支持事务处理,保证 ACID 特性 | 不支持事务处理 |
崩溃恢复 | 支持崩溃恢复,数据安全性高 | 崩溃后可能需要手动修复,数据安全性较低 |
全文索引 | 支持全文索引,从 MySQL 5.6 开始性能提升 | 支持全文索引,全文搜索性能较好 |
存储结构 | 支持外键约束,保证数据完整性 | 不支持外键约束 |
性能特点 | 写入性能高(行级锁),读取性能稍逊于 MyISAM,但可通过缓存优化 | 读取性能高(表级锁优化),写入性能受限于锁机制 |
适用场景 | 高并发写入、事务处理、数据一致性要求高(如电商平台、金融系统) | 读多写少、全文搜索、对事务要求不高的场景(如新闻网站、CMS) |
内存使用 | 内存使用相对较高,主要用于缓存和事务日志 | 内存使用相对较低 |
表大小限制 | 无明显限制,适合大表 | 单表大小受限于文件系统限制(如 2TB) |
数据完整性 | 支持外键约束,数据完整性高 | 不支持外键约束,数据完整性依赖于应用逻辑 |
备份与恢复 | 支持热备份和在线恢复 | 需要全表锁定,备份和恢复效率较低 |
适用 MySQL 版本 | MySQL 5.5 及以上版本默认存储引擎 | MySQL 5.5 之前默认存储引擎,5.5 之后仍可使用,但逐渐被 InnoDB 替代 |
聚簇索引(Clustered Index):
- 数据行是按照索引键的顺序物理存储的。
- 每个表只能有一个聚簇索引,因为数据行不能同时按照两种不同的顺序进行物理存储。
- 索引的叶子节点直接包含数据行,或指向数据行的存储位置。
- 聚簇索引通常在主键上创建,因为主键的值唯一,且不允许空值。
非聚簇索引(Non-Clustered Index):
- 数据行的物理存储顺序与索引顺序无关。
- 一个表可以有多个非聚簇索引。
- 索引的叶子节点包含索引键和指向数据行的指针(叶子节点不直接存数据)。
- 非聚簇索引可以提高查询性能,但可能会增加写操作的开销,因为需要同时更新索引和数据。
对比:
- 聚簇索引的优势在于对于范围查询和排序操作非常高效,因为数据是按照索引键的顺序存储的。然而,它的劣势在于插入、更新和删除操作可能需要移动数据行,这在大数据量时可能导致性能问题。
- 非聚簇索引的优势在于可以有多个,为表提供多个查询路径,提高了查询的灵活性。它的劣势是可能会增加存储空间的使用,因为除了数据行外,还需要存储索引信息。但它的插入、更新和删除操作优于聚簇索引,因此在查询很少或非范围查询,需要大量修改操作时可以使用非聚簇索引。
特性 | 聚簇索引 | 非聚簇索引 |
---|---|---|
数据存储位置 | 数据行是按照索引键的顺序物理存储的 | 数据行的物理存储顺序与索引顺序无关 |
索引结构 | 索引的叶子节点直接包含数据行,或指向数据行的存储位置 | 索引的叶子节点包含索引键和指向数据行的指针(如行ID) |
索引数量 | 每个表只能有一个聚簇索引 | 一个表可以有多个非聚簇索引 |
查询性能 | 对于基于聚簇索引的范围查询,性能较高 | 可以提高查询性能,但可能会增加写操作的开销 |
维护成本 | 插入、更新和删除操作可能需要移动数据行,成本较高 | 插入、更新和删除操作通常比聚簇索引更快 |
适用场景 | 适合基于主键的查询 | 适合多种查询条件,提供多个查询路径 |
B树与B+树的区别
B树:
- 每个节点可以有多个子节点,包括内部节点和叶子节点。
- 内部节点和叶子节点都可以存储数据。
- 搜索可能需要从根节点开始,逐层遍历到叶子节点(中序遍历)。
- 适用于随机读写操作。
B+树:
- 所有数据都存储在叶子节点中,内部节点仅存储键值信息。
- 叶子节点之间通过指针相连,形成链表结构,便于顺序访问。
- 内部节点不存储数据,因此可以存储更多的索引键,提高了索引的效率。
- 搜索效率更高,尤其是对于范围查询(因为有直接的指针指向)。
对比:
- B树的优势是适用于随机读写操作,但内部节点也存储数据,这限制了索引键的数量,可能会影响索引的效率。
- B+树的优势是所有数据都存储在叶子节点中,内部节点仅存储键值信息,这使得B+树可以存储更多的索引键,提高了索引效率。它的劣势是相对于B树,B+树可能需要更多的存储空间,因为需要额外的指针来连接叶子节点。
特性 | B树 | B+树 |
---|---|---|
数据存储方式 | 内部节点和叶子节点均存储实际数据 | 仅叶子节点存储实际数据,内部节点仅存储键值索引信息 |
叶子节点连接 | 叶子节点之间不存在直接的链接 | 叶子节点通过指针相连,形成链表结构,便于顺序访问 |
范围查询能力 | 需要从根节点开始,逐层遍历至叶子节点,效率相对较低 | 只需遍历叶子节点的链表,效率较高,特别适用于范围查询 |
磁盘I/O操作 | 由于树的高度较高,可能导致较多的磁盘I/O操作 | 树的高度较低,减少了磁盘I/O操作,提高了I/O效率 |
空间利用效率 | 内部节点存储数据,可能导致空间利用率不高 | 内部节点不存储数据,只存储索引,提高了空间利用率 |
适用场景 | 更适合随机访问和较小范围的查询 | 更适合进行大规模范围查询和顺序访问操作 |