导航菜单

数据库选型

经过上一节的分析,我意识到 SQLite 已经无法满足需求。

那一夜,我开始调研替代方案。

数据库分类

┌─────────────────────────────────────────────────────────┐
│                    数据库分类                           │
├─────────────────┬─────────────────┬─────────────────────┤
│   关系型数据库   │   NoSQL 数据库   │    其他数据库       │
├─────────────────┼─────────────────┼─────────────────────┤
│ MySQL           │ MongoDB         │ Redis (缓存)        │
│ PostgreSQL      │ Redis           │ Elasticsearch (搜索)│
│ SQLite          │ Cassandra       │ InfluxDB (时序)     │
│ Oracle          │ DynamoDB        │ Neo4j (图数据库)    │
│ SQL Server      │ Couchbase       │                     │
└─────────────────┴─────────────────┴─────────────────────┘

面对这么多选择,我需要逐一分析。

方案 A:MySQL/PostgreSQL(关系型数据库)

优势

特性说明
成熟稳定几十年发展,社区活跃,文档丰富
SQL 查询支持复杂的 JOIN、子查询、聚合
ACID 事务保证数据一致性和完整性
索引优化B+Tree、哈希、全文等多种索引
主从复制支持读写分离,提升读性能
生态系统丰富的工具和中间件支持

劣势

问题说明
垂直扩展成本高升级 CPU/内存/磁盘成本高
水平扩展复杂分库分表需要应用层支持
超大数据量性能下降单表超过千万级需要优化
Schema 固定修改表结构需要停机维护

适合场景

推荐使用:

  • 用户管理系统(数据量不大,查询复杂)
  • 订单/支付系统(需要事务保证)
  • ERP/CRM 系统(复杂业务逻辑)
  • 报表/数据分析(复杂聚合查询)

不推荐:

  • 海量日志存储(考虑 NoSQL)
  • 高频写入场景(考虑时序数据库)
  • 数据结构频繁变化(考虑文档数据库)

**我的考虑:**用户数据和调用日志需要事务保证,MySQL 是稳妥的选择。

方案 B:MongoDB(文档数据库)

优势

特性说明
Schema 灵活无需预定义结构,易于修改
水平扩展原生支持分片(Sharding)
写入性能好适合日志类数据
JSON 格式与应用程序数据结构一致
丰富查询支持聚合管道、文本搜索

劣势

问题说明
事务支持弱4.0+ 才支持多文档事务
查询功能不如 SQLJOIN 操作复杂
占用内存多索引和数据都在内存
学习曲线查询语法与传统 SQL 不同

适合场景

推荐使用:

  • 日志数据(写多读少)
  • 内容管理系统(文档结构)
  • 物联网数据(Schema 灵活)
  • 用户行为追踪

不推荐:

  • 金融系统(需要强事务)
  • 复杂关联查询(多表 JOIN)

**我的考虑:**MongoDB 很灵活,但我的数据结构固定,而且需要事务保证。

方案 C:Redis(缓存数据库)

优势

特性说明
极快的速度纯内存操作,微秒级延迟
数据结构丰富String、List、Hash、Set、ZSet
过期时间可以设置 Key 自动过期
持久化支持 RDB 和 AOF 持久化
发布订阅支持消息队列功能

劣势

问题说明
内存成本高内存比磁盘贵 10-100 倍
数据量受限受限于内存大小
持久化复杂需要权衡性能和可靠性
查询功能弱不支持复杂查询

适合场景

推荐使用:

  • 缓存热点数据
  • 计数器(今日调用量)
  • 会话存储(Session)
  • 消息队列
  • 实时排行榜

不推荐:

  • 主数据存储
  • 大量历史数据
  • 复杂查询需求

**我的考虑:**Redis 不能做主存储,但做缓存再好不过。

方案 D:时序数据库(InfluxDB、TimescaleDB)

优势

特性说明
时间序列优化专为时间戳数据设计
高压缩率压缩率可达 10:1
时间查询快时间范围查询性能优异
自动过期支持数据保留策略

劣势

问题说明
学习成本高查询语言独特
功能单一不适合通用场景
社区较小生态不如关系型数据库

适合场景

推荐使用:

  • 监控数据(CPU、内存使用率)
  • 传感器数据(IoT)
  • 应用日志
  • 金融行情数据

**我的考虑:**时序数据库很专业,但我的日志查询需求不那么特殊,MySQL 就够了。

混合架构

现代应用通常采用多种数据库组合

┌─────────────────────────────────────────────────────────┐
│                     应用层                               │
└─────────────────┬───────────────────────────────────────┘

        ┌─────────┼─────────┬──────────────┐
        ▼         ▼         ▼              ▼
   ┌────────┐ ┌────────┐ ┌──────────┐ ┌──────────┐
   │ MySQL  │ │ Redis  │ │ MongoDB  │ │ Elastic- │
   │        │ │        │ │          │ │ search   │
   │ 主数据 │ │ 缓存   │ │ 日志     │ │ 搜索     │
   └────────┘ └────────┘ └──────────┘ └──────────┘

分析完所有选项后,我的决策逻辑逐渐清晰。

我的决策

经过几天的调研,我在白板上画了一个决策矩阵:

需求首选方案理由
用户数据MySQL需要事务,数据结构固定
调用日志MySQL + Redis 缓存查询频繁,需要快速响应
实时计数器Redis高并发写入,快速读取
会话存储Redis天然适合,支持过期

最终决定:MySQL + Redis 的混合架构

这个方案的利弊:

优点:

  • MySQL 保证数据一致性和持久化
  • Redis 提升热点查询性能
  • 技术成熟,学习成本低
  • 社区活跃,问题容易解决

⚠️ 挑战:

  • 需要维护两种数据库
  • 缓存一致性问题需要处理
  • 初期架构复杂度增加

但我知道,这是成长的代价。

本节小结

✅ 数据库选型要点:

数据库核心优势典型场景
MySQLACID 事务、复杂查询用户、订单、支付
MongoDB灵活 Schema、水平扩展日志、内容管理
Redis极速读写、数据结构缓存、计数器
时序 DB时间序列优化监控、IoT 数据

🎯 下一步

分析完各种数据库后,我决定采用 MySQL + Redis 的混合方案。

接下来,我要开始迁移实战。

搜索