跳到主要内容

存储与索引概览

信息
2024年8月13日 · ·

数据库(这里仅探讨 关系数据库)底层技术涉及到很多方面,而其核心技术便在于它使用的数据存储结构与索引技术。

存储与索引技术概览

存储结构

  1. 行存储(Row Storage)

    • 特点:数据以行为单位存储,适用于经常进行行级别读取和写入操作的场景,如在线事务处理(OLTP)。
    • 适用场景:业务主要是频繁的小事务操作的 OLTP 系统(如银行交易系统)。
    • 示例
      | ID | Name | Age | City  |
      |----|------|-----|-------|
      | 1 | John | 23 | NY |
      | 2 | Jane | 29 | LA |
  2. 列存储(Column Storage)

    • 特点:数据以列为单位存储,适用于需要处理大规模数据分析和聚合操作的场景,如在线分析处理(OLAP)。
    • 适用场景:数据仓库、数据分析。
    • 示例
      Columns are stored separately as:
      ID: [1, 2]
      Name: [John, Jane]
      Age: [23, 29]
      City: [NY, LA]

索引技术

  1. B+树(B+ Tree)

    • 特点:平衡树,每个节点包含指向子节点的指针和键值,所有数据都存储在叶子节点。
    • 优点:高效的范围查询和排序操作。
    • 缺点:在高并发写入情况下,维护开销较大。
  2. 哈希索引(Hash Index)

    • 特点:使用哈希表结构,以键值对形式存储数据。
    • 优点:适用于精确匹配查询(等值查询)非常高效。
    • 缺点:不支持范围查询。
  3. 位图索引(Bitmap Index)

    • 特点:使用位图表示列的取值,适合低基数数据(即取值种类较少)。
    • 优点:能够快速处理复杂的 AND、OR、NOT 操作。
    • 缺点:对高基数数据不适用,占用较多空间。
  4. 全文索引(Full-Text Index)

    • 特点:针对文本数据进行索引,支持全文检索。
    • 优点:高效处理大文本数据的搜索。
    • 缺点:维护成本高,对存储空间要求较大。
  5. GiST(Generalized Search Tree)

    • 特点:一种可扩展的平衡树结构,适用于各种类型的复杂数据结构和查询需求。
    • 优点:灵活性高,适用范围广(如地理数据、全文搜索等)。
    • 缺点:需要更复杂的实现和维护。
  6. R 树(R-Tree)

    • 特点:用于多维空间数据的索引,如地理信息系统。
    • 优点:对空间范围查询特别高效。
    • 缺点:实现复杂,插入和删除操作可能需要大量重排。

对于常见谓词如等值查询、范围查询,采用 B+树。如 MySQL 的 InnoDB 存储引擎,就默认采用 B+树索引结构,用于支持行存储和常见的范围查询、排序操作。

对于特定的高效查询,如哈希等值查询、位图复杂运算,选用特殊索引。如 PostgreSQL 就支持多种索引,包括 B+树、哈希索引、GiST、GIN(Generalized Inverted Index 用于全文搜索)、SP-GiST(Space-Partitioned Generalized Search Tree)等,以满足不同的查询需求。

下面我们看一下市面上主流关系数据库系统(如 MySQL、PostgreSQL、Oracle、SQL Server)的存储与索引技术是怎么选择和实现的。

MySQL

MySQL 根据用户所选存储引擎的不同,可以有不同的支持,其中最常用的存储引擎是 InnoDB 和 MyISAM。

默认情况下 MySQL 使用 InnoDB(也是最常用的)。它支持事务(ACID 属性),并具有行级锁定和外键支持。MyISAM 则常用于没有事务需求并且读操作远多于写操作的场景下。

存储结构

  • InnoDB

    • 行存储(Row Storage):整个表的一行数据存储在一个连续块中。
    • 数据页:数据存储在数据页(通常为 16KB)中,每页包含多个行。
  • MyISAM

    • 行存储:与 InnoDB 相同。
    • 数据文件与索引文件:每个表有三个文件:数据文件(.MYD)、索引文件(.MYI)和表定义文件(*.frm)。

索引技术

  • InnoDB

    • B+树:InnoDB 使用 B+树作为其默认的索引结构。主键索引(聚集索引)和次级索引(非聚集索引)均使用 B+树。
  • MyISAM

    • B+树:与 InnoDB 相同。

事务与锁

  • InnoDB

    • MVCC(多版本并发控制):通过多个版本的数据行来实现非阻塞读操作。
    • 行级锁定:对单独的行进行锁定,提高了并发性能。
  • MyISAM

    • 不支持事务,也没有行级锁定,而是使用表级锁定。

优势

  • InnoDB

    • 高效的范围查询:B+树在执行范围查询和排序时性能极高。
    • 事务支持:ACID 属性保证了数据的一致性和完整性。
    • 整体读写性能:通过行级锁定和 MVCC 提升了并发读写性能。
  • MyISAM

    • 更小的内存占用:相比 InnoDB,MyISAM 更加轻量,适合只读应用。
    • 较高的读取性能:在没有事务需求并且读操作远多于写操作的场景下,MyISAM 的表现优异。

PostgreSQL

PostgreSQL 是一个对象关系数据库系统,它被设计为扩展性高、符合标准且带有丰富特性的系统。

存储结构

  • 行存储:默认情况下,PostgreSQL 使用行存储。
  • TOAST(The Oversized-Attribute Storage Technique):用于存储大对象或长文本,自动将大字段存储在外部表中。

索引技术

  • B+树

    • 默认索引类型:与 InnoDB 类似,PostgreSQL 默认使用 B+树来进行基本的范围查询和排序。
  • 其他索引

    • Hash 索引:适用于等值查询,但在分布式场景下谨慎使用。
    • GiST(Generalized Search Tree):用于实现全文检索、地理信息系统(GIS)数据索引等。
    • GIN(Generalized Inverted Index):主要用于高效的全文搜索和数组查询。
    • SP-GiST(Space-Partitioned GiST):适用于处理复杂空间数据。
    • BRIN(Block Range INdexes):适用于非常大的表,存储块范围信息以减少全表扫描的开销。

事务与锁

  • MVCC:类似于 InnoDB 的多版本并发控制。
  • 行级锁:支持行级锁定,提高并发操作性能。

优势

  • 拓展性与灵活性:支持多种索引类型以适应不同查询需求。
  • 高性能事务处理:通过 MVCC 和行级锁定实现高效的事务处理。
  • 完整功能支持:丰富的功能集(如存储过程、触发器、派生表、复杂查询语法)使其适合处理复杂的业务逻辑。

Oracle

Oracle 是一种强大的企业级关系数据库管理系统,广泛用于关键的大型业务应用中。

存储结构

  • 行存储(Row Storage):Oracle 主要使用行存储结构,即数据按行存储在数据块中。
  • 分区表(Partitioned Tables):支持对数据表进行水平或垂直分区,以提高查询性能和可管理性。

索引技术

  • B 树索引(B-Tree Indexes)
    • 常规 B 树索引:用于高效的等值和范围查询。
    • 唯一索引:确保列中值的唯一性。
  • 位图索引(Bitmap Indexes):低基数数据列,支持逻辑运算符(AND、OR、NOT)查询。
  • 索引组织表(Index-Organized Tables, IOT):数据按主键索引来存储,类似于聚集索引。
  • 全文索引(Oracle Text):高效检索和全文搜索功能。
  • 反向键索引(Reverse Key Indexes):避免索引热点问题。

事务与锁

  • MVCC(多版本并发控制):通过保存数据的多个版本来支持并发读和写操作。
  • 表级锁、行级锁:提供灵活的锁策略以优化事务处理。

优势

  • 企业级特性:高度可靠、可扩展,适合关键任务应用。
  • 丰富的索引类型:针对不同查询模式和数据特点,提供多种索引选项。
  • 高性能事务支持:使用 MVCC 和灵活锁定策略,提高了并发性能和事务一致性。

SQL Server

SQL Server 是微软的关系数据库管理系统,广泛用于企业解决方案中。

存储结构

  • 行存储(Row Storage):默认采用行存储结构,将行数据存储在数据页中。
  • 列存储(Columnstore Indexes):用于数据仓库和分析需求。

索引技术

  • B+树(Clustered and Non-Clustered Indexes)
    • 聚集索引(Clustered Indexes):数据按索引顺序存储。
    • 非聚集索引(Non-Clustered Indexes):独立于数据存储的次要索引。
  • 全文索引(Full-Text Indexes):文本数据的高效全文搜索。
  • 列存储索引(Columnstore Indexes):大规模数据分析,提供更高的压缩率和查询性能。
  • 地理空间索引(Spatial Indexes):地理信息系统(GIS)数据的高效查询。

事务与锁

  • MVCC(多版本并发控制):通过行版本控制减少并发冲突。
  • 锁级别:支持多种锁定策略,包括行级锁、页级锁和表级锁。

优势

  • 全面功能:提供企业级任务关键的功能,如高可用性、备份恢复和数据安全。
  • 混合负载优化:支持行存储和列存储,使其既适用于事务处理又适用于数据分析。

选型考量

存储结构

  • 行存储优点:适合频繁更新和插入操作,如 OLTP 系统,事务处理频繁。
  • 列存储优点:适合数据分析和聚合操作,如 OLAP 系统,大规模数据的聚合和分析。

索引技术

  • B+树范围查询与排序,B+树在处理范围查询和排序时效率最高。
  • Hash 索引等值查询,Hash 索引在处理等值查询时性能卓越。
  • 位图索引:用于低基数数据的快速逻辑运算查询(Oracle 优秀)。
  • 全文索引:高级文本检索功能(Oracle 和 SQL Server 均提供)。
  • GiST / GIN复杂数据类型支持,如全文搜索、地理数据处理,提升特定类型查询效率。
  • BRIN大数据集的优化,通过块级索引减少了全表扫描的成本。

事务与锁的支持

  • MVCC(多版本并发控制):Oracle、PostgreSQL、SQL Server 和 InnoDB 全部支持 MVCC。
  • 多级锁定策略:主流数据库系统提供的用于优化并发事务处理的锁定策略。

综合因素

  • 效率和性能:B+树的范围查询效率和 B 树索引的一致性保证,位图索引在低基数数据的空间效率,全文索引的文本搜索能力。
  • 灵活性和扩展性:支持多种索引类型和存储方式,以适应不同业务需求。
  • 事务一致性:通过 MVCC 和灵活的锁定策略,保证高并发环境下的数据一致性和完整性。
  • 企业需求:面向不同规模的业务需求和使用场景,提供高可用性、高可靠性和数据安全。

未来趋势

未来数据库技术的发展将以智能化、融合存储、增强分布式和云能力、安全性和隐私保护为主要方向。

  • 智能化数据库系统:利用机器学习和人工智能技术,动态优化查询、索引和数据库参数设置,提高系统整体性能。
  • 融合存储与 HTAP:结合 OLTP 和 OLAP 的优势,支持实时交易处理和数据分析的一体化系统,满足多样化的业务需求。
  • 内存与新型存储技术:利用高速内存和新型存储器件(如 3D XPoint),大幅提升数据访问速度,优化内存数据库的性能。
  • 全球一致性与 Serverless 架构:通过先进的分布式一致性协议和 Serverless 架构,实现高可用、弹性扩展的分布式数据库系统,降低运维成本。
  • 多云策略与跨云互操作:支持多云部署和跨云互操作,提升资源利用率,确保业务连续性和灵活性。
  • 数据安全与隐私保护:采用零知识证明、同态加密等技术,实现数据的全生命周期安全保护,确保数据隐私。

结语

各主流关系数据库在存储结构和索引技术上的选择和实现都是为了满足特定业务需求和性能优化。如 MySQL 的 InnoDB 强在 OLTP 上的应用;PostgreSQL 提供多样的索引类型(B+树、Hash、GiST、GIN 等)和 TOAST 技术,灵活性和扩展性更强,适应复杂查询和高定制化场景中的特殊需求;Oracle 和 SQL Server 在企业级任务关键应用中表现强势。选择合适的关系数据库应根据具体业务需求、查询模式和性能要求等因素综合考量。


PS:感谢每一位志同道合者的阅读,欢迎关注、点赞、评论!