存储 与索引概览
信息
2024年8月13日 · ·
数据库(这里仅探讨 关系数据库
)底层技术涉及到很多方面,而其核心技术便在于它使用的数据存储结构与索引技术。
存储与索引技术概览
存储结构
-
行存储(Row Storage)
- 特点:数据以行为单位存储,适用于经常进行行级别读取和写入操作的场景,如在线事务处理(OLTP)。
- 适用场景:业务主要是频繁的小事务操作的 OLTP 系统(如银行交易系统)。
- 示例:
| ID | Name | Age | City |
|----|------|-----|-------|
| 1 | John | 23 | NY |
| 2 | Jane | 29 | LA |
-
列存储(Column Storage):
- 特点:数据以列为单位存储,适用于需要处理大规模数据分析和聚合操作的场景,如在线分析处理(OLAP)。
- 适用场景:数据仓库、数据分析。
- 示例:
Columns are stored separately as:
ID: [1, 2]
Name: [John, Jane]
Age: [23, 29]
City: [NY, LA]
索引技术
-
B+树(B+ Tree):
- 特点:平衡树,每个节点包含指向子节点的指针和键值,所有数据都存储在叶子节点。
- 优点:高效的范围 查询和排序操作。
- 缺点:在高并发写入情况下,维护开销较大。
-
哈希索引(Hash Index):
- 特点:使用哈希表结构,以键值对形式存储数据。
- 优点:适用于精确匹配查询(等值查询)非常高效。
- 缺点:不支持范围查询。
-
位图索引(Bitmap Index):
- 特点:使用位图表示列的取值,适合低基数数据(即取值种类较少)。
- 优点:能够快速处理复杂的 AND、OR、NOT 操作。
- 缺点:对高基数数据不适用,占用较多空间。
-
全文索引(Full-Text Index):
- 特点:针对文本数据进行索引,支持全文检索。
- 优点:高效处理大文本数据的搜索。
- 缺点:维护成本高,对存储空间要求较大。
-
GiST(Generalized Search Tree):
- 特点:一种可扩展的平衡树结构,适用于各种类型的复杂数据结构和查询需求。
- 优点:灵活性高,适用范围广(如地理数据、全文搜索等)。
- 缺点:需要更复杂的实现和维护。
-
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)。