数据库与其所用数据结构

数据库系统的高效增删改查(CRUD)依赖于多种底层数据结构和优化机制。以下是数据库中使用的主要数据结构及其在CRUD中的关键知识点:


一、数据库核心数据结构

1. B树/B+树

用途 :索引结构(如MySQL的InnoDB索引、Oracle的索引组织表)。

特点

B+树 :叶子节点通过指针连接,支持高效范围查询和顺序扫描。

• 平衡树结构,插入/删除时通过节点分裂与合并保持平衡。

增删改查优化

查询 :通过树的高度(O(log n))快速定位数据。

插入/删除:需维护节点填充因子,避免频繁分裂。

2. 哈希表

用途 :哈希索引(如MemSQL的内存表、MySQL的Memory引擎)。

特点

• 等值查询时间复杂度 O(1)

• 冲突解决:链式哈希或开放寻址。

增删改查优化

• 适合精确匹配查询,但不支持范围查询

• 哈希表扩容时需重新哈希(rehashing),可能阻塞写入。

3. LSM树(Log-Structured Merge-Tree)

用途 :写优化存储引擎(如LevelDB、RocksDB、Cassandra)。

特点

• 数据先写入内存(MemTable),再批量刷入磁盘(SSTable)。

• 通过后台合并(Compaction)减少碎片。

增删改查优化

写入 :极高吞吐(顺序写 + 批量刷盘)。

查询:需合并内存和磁盘的多层数据,可能延迟较高。

4. 堆文件(Heap File)

用途 :存储无聚簇索引的表数据(如PostgreSQL的堆表)。

特点

• 数据无序存储,通过行指针(TID)定位。

• 支持快速插入(追加到文件末尾)。

增删改查优化

查询 :需依赖索引,否则全表扫描(O(n))。

删除:标记删除或使用空闲空间映射(Free Space Map)。

5. 倒排索引(Inverted Index)

用途 :全文搜索(如Elasticsearch、MySQL的全文索引)。

特点

• 词项到文档的映射(如 "apple" → [doc1, doc3])。

• 支持布尔查询、短语匹配等。

增删改查优化

插入/删除文档 :需更新倒排列表。

查询:通过词项合并算法(如跳表指针)加速交集/并集运算。

6. 其他数据结构

R树 :空间索引(地理数据查询)。

跳表(Skip List) :Redis的ZSET实现。

Trie树:前缀搜索(如IP路由表)。


二、做好增删改查需掌握的关键内容

1. 索引设计

聚簇索引 vs 非聚簇索引

• 聚簇索引(如InnoDB主键索引)决定数据物理存储顺序。

• 非聚簇索引(二级索引)存储主键值,需回表查询。

联合索引 :最左前缀匹配原则(如INDEX(a, b)可优化WHERE a=1 AND b=2,但无法优化WHERE b=2)。

2. 事务与并发控制

锁机制

• 行锁、间隙锁(避免幻读)、表锁。

• 死锁检测与回滚(如InnoDB的wait-for graph)。

MVCC(多版本并发控制)

• 通过版本链(Undo Log)实现读不阻塞写。

• 快照读(ReadView)保证可重复读。

3. 存储引擎优化

写优化

• LSM树的批量写入与Compaction策略。

• WAL(Write-Ahead Logging)保证持久性(如InnoDB的Redo Log)。

读优化

• 缓冲池(Buffer Pool)管理热点数据。

• 预读(Prefetch)策略减少磁盘IO。

4. 查询优化器

执行计划

• 索引选择(EXPLAIN分析)、连接顺序优化(如MySQL的JOIN优化器)。

• 统计信息:直方图(Histogram)、基数(Cardinality)估算。

代价模型:CPU、IO、内存成本的综合评估。

5. 数据分区与分片

水平分片 :按范围或哈希将数据分布到多个节点(如MySQL分库分表)。

垂直分片:按列拆分(如将大字段单独存储)。

6. 日志与恢复机制

Redo Log :崩溃后重放未刷盘的操作。

Undo Log :回滚未提交事务,实现MVCC。

Binlog:主从复制与时间点恢复。


三、实践建议

  1. 场景化选择存储引擎
    • 高并发写入 → LSM树(如RocksDB)。
    • 复杂事务 → B+树(如InnoDB)。
  2. 避免索引滥用
    • 索引会增加写入开销,需权衡查询性能与存储成本。
    • 使用覆盖索引(Covering Index)减少回表。
  3. 监控与分析工具
    • 慢查询日志(Slow Query Log)。
    • 性能模式(如performance_schema)。
  4. 学习源码与论文
    • InnoDB引擎源码(C++)、PostgreSQL文档。
    • Google的Spanner、Amazon的Aurora论文。

四、典型数据库对比

数据库 核心数据结构 适用场景
MySQL B+树(InnoDB)、哈希索引 OLTP、Web应用
PostgreSQL B树、GiST(通用搜索树) 复杂查询、GIS数据
MongoDB B树、WiredTiger的LSM树 JSON文档、灵活模式
Redis 跳表、哈希表、字典树 缓存、实时数据处理

掌握这些数据结构与机制,能帮助你设计高效的数据库方案,并针对性地优化增删改查性能。实际开发中需结合具体数据库实现细节(如参数配置、存储引擎特性)深入分析。

相关推荐
秃头摸鱼侠21 分钟前
MySQL查询语句(续)
数据库·mysql
MuYiLuck29 分钟前
【redis实战篇】第八天
数据库·redis·缓存
睡觉待开机29 分钟前
6. MySQL基本查询
数据库·mysql
大熊猫侯佩1 小时前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(三)
数据库·swiftui·swift
大熊猫侯佩1 小时前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(二)
数据库·swiftui·swift
大熊猫侯佩1 小时前
用异步序列优雅的监听 SwiftData 2.0 中历史追踪记录(History Trace)的变化
数据库·swiftui·swift
大熊猫侯佩1 小时前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(一)
数据库·swiftui·swift
Ares-Wang1 小时前
负载均衡LB》》HAproxy
运维·数据库·负载均衡
AI.NET 极客圈2 小时前
.NET 原生驾驭 AI 新基建实战系列(四):Qdrant ── 实时高效的向量搜索利器
数据库·人工智能·.net
无敌的小笼包2 小时前
第四讲:类和对象(下)
数据结构·c++