1. 王坚那一问,戳中的不是某个产品,而是整个行业的人才断层
做了十几年数据相关的工作,我最常被外行朋友问的一句话是:“数据库不就是装个MySQL、写两句SQL吗?”我每次都很难回答,因为这句话只对了一半。数据库确实是每个应用的底座,但“用数据库”和“做数据库”之间,隔着的不是一个工具的距离,而是一条完整的技术栈。直到几年前我在一场数据库主题的技术活动上,听到王坚向台下的开发者和学生提了个问题,我才真正意识到这个行业缺的不只是产品,更是人。他当时问的大意是:中国的应用层已经长出了那么多大树,可是大树底下供着的那层土壤——数据库——有多少是我们自己培育的?台下沉默的那几秒,我至今印象很深。
1.1 数据库不是“能用就行”的地基
很多人对数据库的理解止步于“存数据用的软件”。实际上一套数据库要面对的问题是极端复杂的:它要在断电后把数据找回来,要在多个用户同时写入时不乱套,要在每秒几万次查询下还保持稳定,要能扛住某个大版本的Bug带来的元数据损坏。
我做过一段时间银行核心系统的外围支持,深刻体会到一个词:敬畏。数据库是地基中的地基。上层应用写得再漂亮,如果底层事务提交错了、主从同步断了、索引和数据页对不上,那所有上层业务都会立刻跟着遭殃。而且这类故障一旦发生,恢复过程往往不是重启一下就能解决,轻则回放日志、重则让业务停机几个小时。
所以王坚那一问,表面上看是在问“数据库软件是谁做的”,实际上是在问另一个问题:我们有多少人真正理解“存储引擎里一个Page是怎么被管理”的?有多少人能在没有现成数据库开源代码的情况下,从零写出一套可用的存储和事务系统?这就是人才断层。
1.2 从“会调库”到“会造库”,中间隔了一个完整T字
我见过很多聪明的开发者,写业务代码非常顺,甚至能手写一个连接池、做一套缓存方案。但一旦涉及到“数据库内核”这个话题,大部分人立刻就沉默了。原因不复杂:大学课程里教SQL、教数据库原理,却很少有人真的让学生去实现一个数据库。增删改查写得再熟,也不代表你理解了一条DELETE语句在存储引擎里是怎么定位到数据页、加锁、写日志、刷盘的。
“会调库”的人很多,“会造库”的人很少。中间差的不是几本书,而是系统性的训练机会。这也是近两年数据库比赛越来越火的原因之一:它把过去只存在于教科书里的B+树、事务日志、并发控制,变成了供上万名大学生动手实现的项目。从王坚那一问到上万名大学生的赛场,这条线不是偶然,是行业发展的必然。
2. “换道超车”到底怎么换:四张技术牌桌
很多人把国产数据库的“换道超车”理解成“用一个新的数据库去替代Oracle、MySQL”。我不完全同意。如果只是照着老牌数据库的架构再写一遍,那是在旧赛道上追,永远差着一代人的身位。真正的换道,是重新定义数据库的形态。
我自己这些年观察下来,所谓“换道”至少体现在四张新牌桌上:分布式、云原生、向量化、HTAP。每一张牌桌都和传统单机数据库的玩法完全不同。
2.1 分布式数据库:把单机时代的“天花板”变成“起跑线”
传统Oracle架构下,单实例、共享存储的方案做了几十年,扩展性瓶颈很明显。磁盘速度有限,CPU和内存也有限,到了一定规模就只能垂直扩容,买更贵的机器。而分布式数据库走的是另一条路:用一堆普通服务器组成一个集群,数据按照某种规则打散到多个节点上,再把节点之间的数据一致性用共识算法管起来。
我早期用一款开源分布式数据库做过压测,最直观的感受是“扩节点是真的能涨性能”。加几台物理机,查询和写入的吞吐量跟着涨,这在单机数据库时代是不可想象的。当然,分布式也不是银弹,跨节点事务、分布式join、全局一致性都会引入额外开销,但对“数据量大到单机装不下”的场景来说,这是唯一现实的路。
2.2 云原生与存算分离:弹性就是最大的换道优势
云原生数据库的核心理念是“存储和计算分开”。传统数据库,计算和存储耦合在一台机器上,扩容要停机、要搬数据。云原生数据库把数据放到分布式存储层,计算节点变成无状态的服务,需要的时候拉起一批新节点,不需要随时缩掉。
这个能力在突增流量场景特别有价值。比如电商大促、抢票、热点事件,业务量会在几分钟内冲高,传统数据库很难扛住,而云原生数据库可以做到分钟级扩容。存储与计算分离还让“一份数据、多个计算集群”成为可能,比如同一个底层存储既能给业务查询跑一个集群,又能给数据分析跑另一个集群,互相不受影响。
2.3 向量数据库:给数据库装上“AI时代的眼睛”
这两年“向量数据库”这个词从技术圈火到了产品圈,因为它本质上是给应用提供了“按语义相似度找数据”的能力。传统数据库靠字段和索引做精确匹配,比如“年龄等于30”,而向量数据库做的事情更接近人的直觉:你把一张图片、一句话加工成一串向量,然后在这堆向量里找“最相似的”。
我参与过几个RAG类项目,最深的体会是:向量检索的瓶颈不在算法本身,而在“混合查询”的复杂度。业务往往不是只做向量搜索,而是要同时带过滤条件,比如“在库存大于100的商品里找最相似的一款”。如何把向量索引和传统条件过滤结合起来,是当前最值得关注的方向。这也是为什么这类产品能在热词榜单上持续霸榜。
2.4 混合负载HTAP:让OLTP和OLAP不再各占一套系统
以前的企业数据架构,常常是一套在线交易库,一套分析仓库,中间再加同步链路。业务数据先写入交易库,再通过同步工具往数仓里搬。这套架构的现实问题是:数据时效性差、链路长、成本高。HTAP数据库想解决的就是“一份数据,同时支持事务和分析”。
我自己踩过的典型场景是运营看板。业务人员希望看到实时数据,但传统方案最快也只能做到分钟级同步。换成HTAP之后,在线数据和实时分析共用一份存储,分析查询不再依赖同步链路,业务侧的感受非常明显。当然HTAP也不是让一个数据库包打天下,复杂分析还是要交给专门的分析引擎,但对很多中小规模场景来说,已经够用了。
| 技术路线 | 解决的核心问题 | 我眼中最大的门槛 |
|---|---|---|
| 分布式数据库 | 扩展性与容灾 | 跨节点一致性和分布式事务 |
| 云原生数据库 | 弹性与成本 | 存储引擎与管控面的配合 |
| 向量数据库 | 语义相似检索 | 向量索引与过滤条件融合 |
| HTAP数据库 | 一份数据多场景复用 | 事务与分析负载互相干扰 |
3. 上万名大学生的赛场:竞赛是如何成为国产数据库“练兵场”的
王坚的那一问没有停留在论坛上。这几年国产数据库厂商开始办比赛,规模确实超出我的预期。我以评委和指导老师的身份参与了几届数据库内核赛,亲眼看到上万名大学生在同一套赛题下拼代码、拼架构、拼稳定性。这个现象值得展开说说。
3.1 一场数据库比赛的真实题目:从零实现一个小型内核
很多没接触过这类比赛的人会问:数据库比赛考的是写SQL吗?答案不是。初赛可能让你写解析器和执行器,决赛往往要求你实现一个能支撑并发访问、崩溃恢复的小型数据库内核。你没法直接调用现成的MySQL、PostgreSQL,得自己设计存储格式,自己写B+树索引,自己处理事务和日志。
我记得某一届决赛的题目大意是:给一批真实数据集,要求参赛队伍完成从建表、插入、查询到并发更新的完整链路,并且保证在进程被强制杀掉后,数据不会丢、重启后能自动恢复。这道题背后考的东西非常具体:你写日志是同步刷盘还是异步刷盘?页面缓存满了之后怎么淘汰?并发控制用的是行锁还是MVCC?崩溃恢复时是重放日志还是扫描数据页?
评分标准也不只是“结果对不对”。执行速度、事务吞吐量、代码结构、文档说明都会进决赛评分。我见过一些队伍功能全做出来了,但代码可读性差到没法维护,最终分数也很受拖累。这和真实软件工程中“能跑只是一个起点”完全一致。
3.2 我在评审中反复看到的三个翻车点
第一,刷盘时机没设计好。很多队伍把数据页直接写到磁盘,却不写日志,或者日志和数据的顺序反了。测试环境一断电,数据库重启后数据页处于中间状态,整个文件都打不开。这本质上是没理解WAL机制的“先日志后数据”原则。
第二,索引乱建。有些队伍为了“性能更好”,给所有列都建了索引。结果写入变慢、存储空间膨胀,还导致查询优化器的选择乱七八糟。真实业务里索引是要为查询模式服务的,不是全列建上就万事大吉。比赛里能暴露这个认知,比工作时被线上慢查询打脸要温和得多。
第三,并发控制过度保守。很多队伍一开始就全表加锁,做成串行执行,虽然保证了正确性,但并发性能直接掉一个量级。后来才慢慢改成行级锁、MVCC。最典型的坑是死锁:两个事务互相等对方持有的锁,没有超时机制,数据库直接卡死。这种问题在真实系统里同样天天发生,只不过线上有报警、有巡场,比赛里没有。
4. 热词背后:普通开发者每年都在踩的数据库坑
如果说赛场是“造库”的人,那大多数开发者还在“用库”阶段。看了一圈近期的搜索热词,我实在太熟悉了:数据库同步软件、数据库连接池、Navicat连接达梦数据库、SQLite数据库用哪个管理工具、Oracle数据库安装和配置、数据库死锁……这些词串起来,就是一名普通程序员一周的日常。它们看起来零散,背后其实对应着几个非常典型的真实痛点。
4.1 连接池:最像“玄学”的问题其实有迹可循
连接池问题几乎每个团队都会遇到。明明数据库本身负载不高,应用却报“连接数不够”或者“获取连接超时”。我排查过不少这样的case,最后发现不是数据库不行,而是连接池参数和业务特征不匹配。连接池不是越大越好,设置过大会把数据库的连接数打满,设置过小又会在高并发时排队。
更容易被忽略的是连接泄漏:应用里取了一个连接,没有归还,连接池被慢慢耗尽;连接池里一堆“睡觉”的连接,数据库端早就把它断掉了,客户端还傻傻地等着。遇到这种问题,别先调参数,先看代码里有没有把Connection包进try-with-resources或finally里。我见过最简单的解决方案只是加了一句finally释放,就把一个持续半个月的线上报警解掉了。
4.2 同步软件最怕的不是慢,是对不上账
“数据库同步工具”这个词被高频搜索,说明大家已经不只是单库用了。做读写分离、做数仓同步、做跨机房容灾,都绕不开数据同步。很多同步工具刚部署的时候看起来非常正常,跑了一周之后,对账发现目标库少了一批数据。这种问题最可怕的地方在于:它不是立刻暴露,而是积累到一定量才炸。
我建议做数据同步项目的时候,先确认三件事:同步任务有没有断点续传能力?长时间断网后数据会不会补上?目标端的写入是不是幂等?我见过一个团队每天全量对比一次,也就是为了在增量同步出错时能及时修。对账不是可选项,是同步方案的必需品。哪怕同步延迟做得再好,对不上账就等于零。
4.3 国产数据库的安装求助,暴露了迁移的真实成本
最近搜索词里,“达梦数据库”“人大金仓”“Navicat连接达梦”频繁出现。这说明已经有很多人开始尝试使用国产数据库了,但安装、连接、驱动兼容等问题也随之而来。我陪朋友做过一次从Oracle到国产数据库的迁移,最大的感受是:数据库迁移不只是“把数据搬过去”,而是把SQL方言、内置函数、自增序列、分页写法、驱动版本全部重新过一遍。
比如Oracle里常用的NVL、SYSDATE、ROW_NUM,在不少国产数据库里可能要用不同的写法替代;分页查询的语法也未必完全兼容。再比如64位驱动和Access数据库的兼容问题,其实就是工程栈里的“位数”一致性没对上,这类坑不会写在官方宣传册里,只能在实际连接时暴露。这些热词说明一件事:国产数据库已经进入真实场景了,而场景里最难的不是技术原理,而是全链路的适配细节。
5. 如果你想上这条赛道:我给你的学习路线和比赛建议
看完上面这些坑,你大概会问:那我要不要学数据库?如果想走这条路,应该怎么学?我的建议很明确:数据库内核和生态方向非常值得投入,但别一开始就想着“造一台宇宙飞船”。从基本功开始,一步步来,远比看一堆概念效率高。
5.1 三件基本功,先别急着上框架
第一条,把SQL和事务隔离级别吃透。不是会增删改查就够了,而是要理解为什么有脏读、不可重复读、幻读,各自在什么隔离级别下出现。这是判断“数据库行为是否符合预期”的基础。
第二条,理解存储和索引。B+树和LSM树是两种最主流的索引结构,不用自己完整实现一遍,但至少要能画出来、能解释清楚查询和写入时为什么会走索引。遇到慢查询,先会看执行计划,比盲目加缓存有用得多。
第三条,理解并发控制。锁、MVCC、死锁、隔离级别之间是互相咬合的。我建议自己动手写一个极小的内存表,用两个线程同时更新同一个字段,观察不同隔离级别下的表现。这种实验比背概念管用十倍。
5.2 比赛不只是写代码:文档、评测、复盘
如果你准备参加数据库比赛,别把精力全部押在写代码上。比赛本身就是一个完整的工程训练过程。文档要写清楚:你的存储格式为什么这样设计?并发控制为什么选这个方案?极限性能是怎么压出来的?这些内容既是给评委看,也是逼你自己想明白取舍。
比赛过程中一定要做性能基线记录。今天改了Buffer Pool淘汰策略,明天加了索引,前后数据对比是什么?如果没有记录,你可能完全不知道自己是不是在盲目优化。我见过很多队伍,代码写得热闹,复盘时却说不出每个改动带来了什么收益。这类问题在真实工作中也一样致命。
5.3 一些非常具体的小建议和避坑清单
我最后想给几条非常落地的小建议:
- 别只看数据库源码,先把它编译起来,然后打断点跑一遍SQL。真跑过一遍,比读十篇源码解析都有用。
- 数据库课程设计不要停留在“做一个图书管理系统”,可以试着做一个支持日志恢复的小型存储引擎。这个作品写到简历上,比“熟练使用MySQL”有说服力得多。
- 排查问题时先看执行计划,再用工具确认锁和事务状态。MySQL里遇到死锁,
SHOW ENGINE INNODB STATUS\G里通常就有最近一次死锁的完整信息,先看这个,别靠猜。 - 换数据库不等于换字符串。迁移前把所有SQL方言函数、类型映射、备份恢复、权限体系都列一个清单,逐个验证,才是最省时间的方式。
这些年下来,我的体会是:数据库领域最缺的不是“会用数据库的人”,而是“愿意钻进存储引擎、事务、索引底层去较真的人”。如果你手里正好有一个项目、一门课程或一场比赛的机会,别只把它当成任务,试着把它做成一个真正属于自己的作品。从王坚的一问到上万名大学生在赛场上的代码交锋,这条路已经铺开了。你是选择站在赛道旁边,还是下来跑一圈,最终会决定你能看到多远的风景。