innodb和myisam、聚簇索引和非聚簇索引、b树和b+树

聚簇索引(Clustered Index)和非聚簇索引(Non-Clustered Index)以及B树和B+树,它们各自有不同的特点和适用场景。

在mysql中,常用搜索引擎支持的索引(结构都为b+树):
InnoDB:支持聚簇索引,也支持非聚簇索引
MyISAM:支持非聚簇索引

特性/方面InnoDBMyISAM
数据存储位置支持行存储和页存储,数据和索引一起存储仅支持表存储,数据和索引分离存储
锁机制支持行级锁,适合高并发写入场景仅支持表级锁,适合读多写少的场景
事务支持支持事务处理,保证 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效率
空间利用效率内部节点存储数据,可能导致空间利用率不高内部节点不存储数据,只存储索引,提高了空间利用率
适用场景更适合随机访问和较小范围的查询更适合进行大规模范围查询和顺序访问操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值