数据库
数据库概念
- 数据库:一个长期存储、有组织的、可共享的数据集合
- 数据库管理系统:用于创建、读取、更新、删除和管理数据库的软件(如MySQL、PostgreSQL、MongoDB、Redis、ClickHouse等)
- 两层关系:应用<–>DBMS<–>存储(磁盘/SSD、缓存)
数据库分类与典型场景
- 关系型数据库:表、行、列、支持SQL、事务(ACID)。典型:MySQL、PostgreSQL、Oracle。适合OLTP(在线事务处理)
- Key-Value存储:超快速读写,常做缓存/会话(Redis、Memcached)
- 文档数据库:JSON/BSON文档,灵活schema(MongoDB)。适合半结构化数据。
- 列式/宽式数据库:面向大规模分析、列存储(Cassandra、HBase、ClickHouse)。适合OLAP/时序/日志分析
- 图数据库:关系密集型图查询(Neo4j、JanusGraph)
- 时序数据库:时间序列优化(InfluxDB、Prometheus TSDB)
- 搜索引擎:全文搜索与倒排索引(Elasticsearch、Solr)
核心概念与内部机制
- Schema/Table/Row/Column/Index/View
- 主键PK/外键FK/唯一约束
- 事务(Transaction):原子性、一致性、隔离性、持久性——ACID
- WAL(Write-Ahead Log):用于持久化与恢复
- MVCC(多版本并发控制):实现高并发读(Postgres、InnoDB)
- 查询优化器/施行计划(EXPLAIN):负责选择索引、join顺序、算子等
- Buffer Pool/Page Cache:内存缓存命中率影响性能
事务隔离级别与并发现象
- 隔离级别(按强到弱):
SERIALIZABLE->REPEATABLE READ->READ COMMITTED->READ UNCOMMITTED - 并发异常:Dirty Read(脏读)、Non-repeatable Read(不可重读)->Phantom(幻读)
- 实务:多数OLTP用
READ COMMITTED或REPEATABLE READ(MySQL默认是REPEATABLE READ),需要严格一致性时用SERIALIZABLE(代价高)
索引
类型:B-tree/Hash/Bitmap/Inverted(全文)
选用要点:
- 高选择性字段适合索引(能过滤大量行)
- 复合索引遵循最左前缀原则
- 覆盖索引(Index Only Scan)可以避免回表
- 索引会增加写入开销和占用磁盘空间
常见命令
1 | CREATE INDEX idx_user_email ON users(email); |
数据建模
- 范式化(1NF,2NF,3NF):减少冗余、保证一致化,适用于事务系统
- 反范化/物化视图/预聚合:用于性能优化,适合读多写少或分析场景(如电商报表)
- 数据仓库建模:星型/雪花模型(OLAP)
分区、分片与扩展策略
- 垂直扩展:更强的单机(CPU/内存/SSD)
- 水平扩展:分片(sharding)/分区,数据按键范围或哈希分布到多节点
- 分区(partition):单库内按范围/列表/哈希分区,方便管理与查询优化
- 分片要谨慎:选择shard key(会影响热点与重分片成本)
复制与高可用
- 模式:主从(主写从读)、主主(双主)、基于一致性协议(Raft/Paxos)
- 同步复制(强一致性) vs 异步复制(提升可用/性能但有副本延迟)
- 常见功能:自动故障切换(failover)、复制延迟监控
备份与恢复
- 备份类型:逻辑备份(SQL dump)与物理备份/快照(更快,可恢复到某一时点)
- WAL+PITR(Point-in-time recovery):可恢复到某个时间点
- 常见策略:定期全备+增量备份+异地存储+定期恢复演练
安全与权限
- 最小权限原则(Role/Grant)
- 加密:传输层TLS、静态数据加密(at-rest)
- 审计日志、敏感数据脱敏/掩码、合规(GDPR/HIPAA)考虑
监控指标与排查方向
- 基础指标:QPS、响应时间(p95/p99)、慢查询数、连续数、CPU、IOPS、磁盘使用、内存使用、缓存命中率、锁等待、复制延迟
- 工具:Prometheus+Grafana、各DB自带统计(pg_stat_statements、MySQL Performance Schema)
常见数据库与推荐场景
- MySQL/PostgreSQL:通用OLTP;Postgres强SQL标准、扩展性好;MySQL社区与生态广
- Redis:会话、缓存、队列(轻量)、限流
- MongoDB:文档存储,schema灵活
- Cassandra/Scylla:写密集型、线性扩展,最终一致性
- ClickHouse/DWH:实时分析、列存储,超快聚合
- Elasticsearch:全文检索与分析
实战常用SQL示例
1 | --链表 |
NoSQL示例(MongoDB)
1 | db.users.insertOne({name:"Alice",email:"a@b.com"}); |
Redis示例
1 | SET session:123 user:1 EX 3600 |
性能调优清单(Checklist)
- 检查慢查询并优化SQL/加索引
- 合理设计索引,避免过多无用索引
- 设计连接池、Prepared Statements、批量写入
- 利用缓存(Redis)和读写分离
- 避免N+1查询、过度JOIN
- 对分析场景使用列式存储/ETL到数据仓库
- 定期重建碎片化索引/VACUUM(Postgres)
常见误区
- 加索引并不都是好事,会增加开销与空间成本
- 分片不能无限扩容,分片设计复杂、跨分片join/事务很难
- 主从复制也是有成本的,存在复制延迟、一致性问题
选型建议(简单决策树)
- 需要强事务&复杂查询->PostgreSQL/MySQL
- 需要极低延迟缓存->Redis
- 文档型灵活schema->MongoDB
- 高并发写入、线性拓展->Cassandra/Scylla
- 大数据分析/实时OLAP->ClickHouse/BigQuery/Snowflake
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 JasmineRain's blog!
评论
