1. 为什么“选数据库”这件事,比写SQL还决定项目生死
刚入行那会儿,我带过一个电商后台重构项目。团队花三个月把所有业务逻辑重写成微服务,接口压测跑得飞起,上线前一周突然卡在订单履约模块——高峰期下单延迟飙升到8秒,库存扣减频繁出错,客服电话被打爆。排查三天,发现不是代码问题,也不是服务器配置低,而是当初图省事,用MySQL硬扛了所有场景:商品目录用JSON字段存规格,订单快照直接序列化进text字段,促销规则用触发器动态计算……数据一过千万,索引失效、锁表、主从延迟全来了。最后推倒重来,拆成MySQL(核心交易)+ Redis(缓存与计数)+ Elasticsearch(商品搜索)+ TimescaleDB(履约时序日志),两周内恢复稳定。
这件事让我彻底明白: 数据库不是“装好就能用”的基础设施,而是整个系统性能、一致性、扩展性与运维成本的底层锚点 。你选错MySQL,可能只是慢一点;选错MongoDB存金融流水,可能直接违反审计要求;用Cassandra做强一致事务,等于给自己挖坑;拿SQLite当SaaS多租户主库,上线即崩。这不是技术偏好问题,而是对数据本质的理解问题—— 数据有没有强关系?变不变?查得多还是写得多?要实时还是离线?能不能容忍丢几条? 这些问题没想清楚,光看“高并发”“海量数据”“云原生”这些词去选型,跟蒙眼开车没区别。
这篇内容,就是我把十年间踩过的27个数据库选型坑、服务过的43个不同行业客户(从IoT传感器平台到银行风控中台)、亲手部署维护过的19种数据库引擎的经验,浓缩成一套可落地的决策框架。它不讲抽象理论,不列参数对比表,而是带你像老司机一样,从需求现场出发,一步步推导出“这个项目到底该用哪个库”。适合三类人:正在做技术方案的架构师、要写毕业设计的计算机学生、以及被老板一句“上个新数据库吧”砸懵的后端同学。接下来的内容,每一步都有真实案例佐证,每个判断都有取舍依据,所有推荐都附带“什么情况下千万别用”的禁忌提示。
2. 数据库选型的本质:不是比参数,而是解构你的数据DNA
2.1 别急着看文档,先画一张“数据行为图谱”
很多团队一上来就打开DB-Engines排名,盯着TPS、QPS、分片能力猛看。这就像相亲只问“月薪多少”,却不知道对方是朝九晚五坐班,还是凌晨三点还在调试无人机飞控。真正决定数据库命运的,是数据在你系统里“怎么活”。
我习惯让团队用一张A4纸手绘四象限图,横轴是 数据变更频率 (低:每天改几次;高:每秒写百次),纵轴是 查询复杂度 (简单:按ID查单条;复杂:多表JOIN+聚合+全文检索)。四个象限对应典型场景:
-
左上(低写+复杂查) :BI报表系统、监管报送平台。数据T+1导入,但要跑几十个维度交叉分析。这类场景,PostgreSQL的物化视图+分区表+并行查询,比MySQL快3倍以上;而ClickHouse的向量化执行引擎,在亿级事实表上秒出结果,但别指望它支持事务。
-
右上(高写+复杂查) :实时风控引擎、广告竞价日志分析。每秒百万事件写入,同时要实时计算用户画像标签。这里TimescaleDB(基于PostgreSQL的时序扩展)和Doris(MPP架构)是主流选择,但要注意:TimescaleDB依赖PostgreSQL生态,Doris需要独立运维一套Java服务。
-
左下(低写+简单查) :CMS后台、内部OA系统。用户增删改查,数据量<10万,95%请求是单表CRUD。这时候SQLite反而是最优解——零配置、零运维、文件级备份,连Docker都不用起。我见过某医疗设备厂商用SQLite存设备固件版本记录,三年没出过一次故障。
-
右下(高写+简单查) :IoT设备心跳上报、游戏登录日志。写入压力极大,但查询只要“查某设备最近10条记录”。Redis的Stream结构或InfluxDB的Tag索引能轻松扛住,但千万别用MongoDB——它的WAL日志和B树索引在纯追加写场景下,磁盘IO浪费高达40%。
提示:画这张图时,必须用 生产环境真实流量 ,而不是测试环境模拟数据。我曾帮一家物流客户诊断,他们说“日均写入500万单”,结果一查监控,峰值写入集中在早8点-10点,瞬时QPS达12000,但其他时段不到200。这种脉冲式负载,用Kafka+流处理预聚合,再写入数据库,比直接堆SSD更省钱。
2.2 关系型 vs 非关系型:不是二选一,而是“数据契约”的显性化
“用MySQL还是MongoDB?”这个问题本身就有陷阱。真正该问的是: 你的业务是否允许数据“松耦合”?
举个例子:电商订单表。如果业务要求“下单时必须校验库存、扣减优惠券、生成物流单”,且这三步要原子性(要么全成功,要么全回滚),那MySQL的ACID事务就是刚需。你强行用MongoDB的multi-document事务,性能会掉30%,还失去分片能力——因为MongoDB的分布式事务要求所有文档在同一个分片上。
但如果是用户行为埋点数据:页面浏览、按钮点击、视频播放进度。这些数据天然无强关联,写入后基本不更新,查询只要按用户ID或时间范围拉取。这时MongoDB的灵活Schema就体现价值:不用每次新增埋点字段就ALTER TABLE,也不用为几十种事件类型建几十张表。我们给某短视频平台做的埋点系统,用MongoDB分片集群存了23TB行为日志,单集合自动按时间分片,运维成本比MySQL分库分表低60%。
关键判断点就一个: 当你的业务出现“跨实体强一致性要求”时,关系型数据库的约束力就是护城河;当你的数据是“自我完备的事件包”,非关系型数据库的写入吞吐和弹性就是加速器。
注意:别被“NewSQL”概念带偏。TiDB、CockroachDB确实支持水平扩展+强一致,但代价是学习成本陡增。我服务过一家支付公司,为追求“全球多活”,上了TiDB,结果发现80%的慢查询来自JOIN操作——TiDB的分布式JOIN要跨节点拉数据,延迟比单机MySQL高5倍。最后他们把核心交易切回MySQL主从,TiDB只用于对一致性要求稍低的对账模块。
2.3 “云数据库”不是银弹:托管服务背后的隐性成本
现在一提数据库,很多人第一反应是“上云”。阿里云RDS、AWS RDS、腾讯云TDSQL确实省心,但“省心”是有代价的。
最典型的隐形成本是 连接数限制 。某在线教育公司用RDS MySQL,配置了32核128G,但线上总连接数卡在3000。一查发现:RDS的max_connections参数受实例规格硬限制,升级配置要停机重启,而他们用Druid连接池,空闲连接超时设置不合理,导致连接堆积。最后方案是:改用阿里云PolarDB(


531

被折叠的 条评论
为什么被折叠?



