数据库概念

  • 数据库:一个长期存储、有组织的、可共享的数据集合
  • 数据库管理系统:用于创建、读取、更新、删除和管理数据库的软件(如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 COMMITTEDREPEATABLE READ(MySQL默认是REPEATABLE READ),需要严格一致性时用SERIALIZABLE(代价高)

索引

  • 类型:B-tree/Hash/Bitmap/Inverted(全文)

  • 选用要点:

    • 高选择性字段适合索引(能过滤大量行)
    • 复合索引遵循最左前缀原则
    • 覆盖索引(Index Only Scan)可以避免回表
    • 索引会增加写入开销和占用磁盘空间
  • 常见命令

1
2
CREATE INDEX idx_user_email ON users(email);
EXPLAIN ANALYZE SELECT * FROM users WHERE email ='a@b.com';

数据建模

  • 范式化(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
2
3
4
5
6
7
8
9
10
11
12
13
14
--链表
CREATE TABLE users(
id SERTAL PRIMARY KEY,
name TEXT NOT NULL,
email TEXT UNIQUE
);
--事务
BEGIN;
UPDATE accounts SET balance =balance - 100 WHERE id =1;
UPDATE accounts SET balance =balance + 100 WHERE id =2;
COMMIT;

--查看执行计划(Postgres)
EXPLAIN ANALYZE SELECT * FROM users WHERE email ='a@b.com';

NoSQL示例(MongoDB)

1
2
3
db.users.insertOne({name:"Alice",email:"a@b.com"});
db.users.createIndex({email:1},{unique:true});
db.users.find({name:"Alice"});

Redis示例

1
2
3
SET session:123 user:1 EX 3600
HSET user:1 name "Alice" age "30"
GET session:123

性能调优清单(Checklist)

  • 检查慢查询并优化SQL/加索引
  • 合理设计索引,避免过多无用索引
  • 设计连接池、Prepared Statements、批量写入
  • 利用缓存(Redis)和读写分离
  • 避免N+1查询、过度JOIN
  • 对分析场景使用列式存储/ETL到数据仓库
  • 定期重建碎片化索引/VACUUM(Postgres)

常见误区

  • 加索引并不都是好事,会增加开销与空间成本
  • 分片不能无限扩容,分片设计复杂、跨分片join/事务很难
  • 主从复制也是有成本的,存在复制延迟、一致性问题

选型建议(简单决策树)

  • 需要强事务&复杂查询->PostgreSQL/MySQL
  • 需要极低延迟缓存->Redis
  • 文档型灵活schema->MongoDB
  • 高并发写入、线性拓展->Cassandra/Scylla
  • 大数据分析/实时OLAP->ClickHouse/BigQuery/Snowflake

牛客MySQL学习文章