资讯动态

初识数据库:从选型到核心原理,一文讲透表、索引、事务与锁

发布时间:2026/9/24 20:16:00 来源:尧图企业网站定制
说实话我第一次接触数据库的时候心里想的是这不就是一个服务器上跑的高级Excel表格吗后来真正动手做项目才发现数据库比我预想的要复杂得多也可靠得多。这篇“初识数据库上”我打算用一名开发者的视角把数据库最基础的东西讲透它到底解决了什么问题、有哪些分类、主流的MySQL、Oracle、达梦、PostgreSQL、SQLite、MongoDB、向量数据库这些到底该咋选以及入门阶段必须理解的表、索引、事务、锁和连接池到底是怎么回事。适合三类人看刚上完数据库课但脑子一片空白的在校生工作里被MySQL和Oracle差点逼疯的全栈开发以及想学数据分析但一直没搞明白数据该放哪儿的爱好者。这篇文章不会堆概念我尽量说人话把每个问题背后“为什么”拆开讲。你看完以后不一定能立刻成为DBA但至少再遇到建表、选型、排查死锁这些事心里会有个大概方向。1. 数据库解决的问题从一张Excel表的崩溃说起1.1 多人同时写一个文件到底会发生什么先回到最朴素的问题。我们完全可以用Excel、CSV甚至一个JSON文件存数据事实上很多小项目就是这样起步的。我见过不少团队一开始用共享文件夹放Excel靠人工维护谁要改数据就发个消息说“我锁定了”改完再手动合并。这种模式在一个人单干的时候完全没问题但一旦变成几个人同时读写问题立刻暴露。举个具体的场景你和同事同时打开同一张表你更新了第10行客户的手机号他更新了第20行客户的地址然后各自保存。如果这个Excel文件是共享盘上同一份后保存的人往往会覆盖先保存的人的内容甚至整个文件损坏。就算你们用在线协作文档也很难处理复杂的校验规则比如“这笔订单的金额不能超过该用户的信用额度”“这个库存字段不能被改成负数”等等。更麻烦的是崩溃恢复。Excel写一半断电了文件打不开程序写完几条记录突然异常退出数据到底写没写进去没人知道。这些问题靠人工去盯早晚出事。1.2 数据库替你扛下的五件事数据库这种基础软件本质上就是把上面这些麻烦统一接过来集中解决。你不需要每做一个项目都自己写一套并发控制、崩溃恢复和权限系统。它至少有五个核心能力是你用文件存储很难替代的持久化存储数据写入磁盘以后断电、重启、程序崩溃都不会丢。数据库内部有日志和刷盘机制保证你提交成功的数据就是稳定落地的。并发控制很多人同时读写同一份数据时数据库通过锁、多版本并发控制MVCC等手段保证数据不会错乱不会出现你改一半我改一半互相覆盖的情况。高效查询数据量从几千行涨到几千万行的时候普通文件几乎没法用了。数据库靠索引和管理优化器让你能在一个合理时间内找到想要的数据。安全与权限谁能看哪些表谁能改哪些数据谁能执行删除操作数据库里有完整的用户权限体系。这比把Excel放在共享目录里设个只读密码要可靠得多。高可用与一致性主从复制、备份恢复、故障切换这些能力让系统可以用多台机器共同保证数据不丢、服务不断。后面要讲的数据库同步软件、同步工具本质上都是在为这项目标服务。记住这五件事你就能理解为什么几乎所有业务系统最终都会落到数据库上。它不是某个公司拍脑袋选的而是被大量真实场景逼出来的必然结果。2. 别被“关系型/非关系型”绕晕先看业务再认亲2.1 关系型数据库为什么能统治四十年“关系型数据库”这个词听着很学术其实核心思想很简单把数据组织成一张张二维表每张表有行和列行代表一条记录列代表一个属性表之间通过键建立关系。比如“用户表”和“订单表”订单表里存一个“用户ID”就能关联到用户信息。所有操作统一用SQL来描述不管是查还是改都有一套标准语法。关系型数据库能统治市场四十多年不是因为老古董顽固不化而是因为它解决了一个特别根基的问题数据一致性。银行转账、订单库存、账务结算这些场景要求数据不能有半点差错。关系模型加上事务机制ACID让开发者可以安心地写“先扣钱再加余额”这样的逻辑而不用担心执行到一半系统崩溃导致钱扣了余额没加。你现在看到的MySQL、PostgreSQL、Oracle、达梦、SQL Server、SQLite都属于这个阵营。哪怕是一些不怎么出名的国产数据库比如IvorySQL、Inceptor底层思路也大多受关系模型影响只是做了不同方向的扩展。2.2 NoSQL、向量数据库这些“非主流”到底强在哪随着互联网业务的发展关系型数据库有些地方开始“不舒服”。比如一张用户表有几十上百个字段不同用户可能填的字段还不一样再比如一天要写入几十亿条日志每条结构都不完全一致又比如社交关系查询你朋友的朋友的朋友这种图结构用SQL一层一层join非常难受。于是NoSQL阵营出现了。MongoDB这类文档型数据库把一条记录直接存成一个JSON文档字段灵活想加就加非常适合快速迭代和结构不固定的数据。Redis这类键值型数据库把数据存在内存里读写极快适合缓存、会话、排行榜。图数据库专门处理节点和边的关系适合做社交网络、风控图谱。最近几年还有一个特别热的词叫向量数据库。它用来存“向量”也就是一串浮点数组成的数组。这串数常由AI模型生成代表内容在语义空间里的位置。向量数据库的核心能力是相似度检索比如“找出一段文字的近义词句”“找出最相似的产品图片”这对大模型应用和RAG检索增强生成场景非常关键。像Milvus、Chroma、pgvector都属于这个方向。说这些不是为了让你立刻去学而是让你建立一个坐标系关系型数据库擅长处理结构化、强一致的数据NoSQL在扩展性、灵活性和性能上做取舍向量数据库则在AI时代补上了“语义检索”这块短板。2.3 实际选型时别一开始就掉进“哪个最好”的坑经常有新手问我“到底是MySQL好还是Oracle好”“MongoDB能不能完全替代MySQL”我的答案通常是脱离业务场景谈数据库好坏都是耍流氓。关系型数据库和非关系型数据库不是取代关系而是互补关系。一个完整的大型系统往往同时用多种数据库用户和订单放MySQL或PostgreSQL缓存用Redis日志和用户行为放MongoDB或ClickHouseAI检索再挂一个向量数据库。你作为一个初学者先掌握一种主流关系型数据库把SQL和建表逻辑搞明白再横向扩展学别的会轻松很多。3. 主流数据库产品盘点MySQL、PostgreSQL、Oracle、达梦、SQLite、MongoDB怎么选3.1 开源界的卧龙凤雏MySQL与PostgreSQLMySQL是目前互联网行业最流行的开源关系型数据库原因很现实它上手门槛低资料多主从复制方案成熟绝大多数云平台都提供一键部署中小团队用起来非常顺手。你随便搜“数据库课程设计”十个里有八个是拿MySQL当底座的。PostgreSQL则是近年口碑极好的“全能选手”。它功能非常全面内置JSON支持、全文检索、窗口函数、PostGIS地理信息扩展很多大厂把它当数据分析的主力库。如果你在做新项目团队没有历史包袱我会更推荐PostgreSQL它在复杂查询和安全合规上做得更扎实默认配置也相对保守稳妥。需要提醒的是这两者虽然都支持SQL但细节差异不少。比如自增主键的语法MySQL是AUTO_INCREMENTPostgreSQL是SERIAL或IDENTITY字符串拼接、去重逻辑、索引写法都有区别。你千万别把一份SQL无缝搬到另一套数据库上到时候报错会报得你怀疑人生。3.2 商业和国产选手Oracle、达梦、金仓、IvorySQLOracle是老牌商业数据库的标杆功能强大、稳定性极高在银行、电信、大型企业系统里依然是主力。代价也很明显授权费用高、需要专职DBA维护普通小团队通常没必要碰。如果你在国企或金融机构工作身边大概率会有一个Oracle或达梦环境。达梦数据库、金仓数据库这些国产选手这几年在政企、信创领域很常见。它们大多在设计上兼容Oracle的某些用法主要解决特定行业的自主可控需求。从技术学习的角度你不需要一开始就专门去学它们因为底层的表和索引、SQL逻辑与主流关系型数据库大同小异。真正进入对应行业后再做适配也不迟。IvorySQL则是一个兼容PostgreSQL的国产分支走的是开源路线玩法基本和PostgreSQL一致。3.3 轻量嵌入式与桌面工具SQLite与dbx工具SQLite不是一台数据库服务器而是一个嵌入式数据库引擎。它的形态就是单个文件谁都能打开不需要安装配置不需要监听端口。移动端App、桌面软件、浏览器插件里大量使用SQLite。如果你只是给本地小工具存数据或者想快速验证一个想法用它最合适。和SQLite配套的你会经常听到dbx数据库工具这类管理工具。dbx可以打开某些特定格式的数据库文件尤其是老一些的Delphi开发环境里用到的本地库。但更常见的场景是你拿到一个.db或者.sqlite文件不知道该用什么打开这时候可以试试DBeaver、SQLiteStudio之类跨平台工具。它们能直接读取表结构、执行SQL上手很快。3.4 文档型和向量数据库当数据不再是整齐的表格MongoDB是文档型数据库的代表存的是类似JSON的文档结构。它的优势在于灵活后端接口加字段不需要先改表结构给产品快速迭代提供了很大空间。但它的事务能力比传统关系型数据库弱复杂多表关联也相对费劲。所以很多团队会把MongoDB用在内容管理、用户画像、日志存储这类“结构不太稳定”的场景而把核心交易数据继续放在MySQL或者PostgreSQL里。向量数据库我在前面提过它解决的问题在传统数据库里很难高效处理。比如你要在1000万条文章里找出跟某句话语义最接近的10条用SQL写like匹配基本不可行但向量数据库通过高维索引可以快速做近似检索。现在主流方案有专门的Milvus、Chroma、Weaviate也有像pgvector这样直接在PostgreSQL里加扩展的轻量方案。如果你正在做大模型相关项目向量数据库迟早会出现在你的技术选型表上。我整理了一个简表方便你快速建立印象数据库类型适合场景选型提醒MySQL关系型Web应用、电商、中小规模业务生态大、资料多、上手快PostgreSQL关系型复杂查询、数据分析、GIS功能全新项目很推荐Oracle关系型银行、电信、大型企业授权贵需要专业DBA达梦/金仓关系型政企、信创环境思想与Oracle类似SQLite嵌入式关系型移动端、本地工具、教学单文件小数据量首选MongoDB文档型灵活结构、快速迭代事务能力弱于关系型向量数据库向量索引AI应用、相似检索、RAG依赖具体场景和模型4. 入门必须搞懂的五个核心概念表、索引、事务、锁、连接池4.1 表、主键、外键一切业务的起点不管你用哪种数据库表都是最基础的单位。一张表定义好了有哪些列、每列是什么类型、可不可以为空这就是“表结构”。设计表结构看起来简单实际很考验人。我见过太多新手上来就把所有字段堆在一张表里最后数据冗余严重、更新异常频发。主键是每张表里用来唯一标识一条记录的字段。它必须非空且不能重复就像身份证号一样。外键则用来表达表与表之间的关系比如订单表里的“用户ID”指向用户表的“用户ID”这样你就不会出现“订单属于一个根本不存在的用户”这种脏数据。很多团队为了性能会故意不用物理外键只在应用层维护逻辑关系但这属于进阶话题初学时先把外键的作用理解透后面你再自己判断要不要用它。4.2 索引不是越多越好用B树的逻辑想问题索引是数据库查询快慢的关键。它的原理类似书的目录通过维护一个额外的数据结构让数据库不用“从头到尾扫一遍表”就能定位数据。主流关系型数据库的InnoDB存储引擎用的是B树索引查询效率很高还能支持范围查找。但索引不是免费的。每建一个索引写入数据的时候就要额外维护一份结构所以索引越多插入、更新、删除反而越慢。新手经常犯两个错一个是完全不懂建索引导致查询全表扫描另一个是无脑给每个字段加索引最后写库慢得不行。正确做法是先根据业务查询条件确定高频查询的字段再在这些字段上建索引用EXPLAIN看执行计划确认是否走索引不要对重复率太高的字段建索引比如“性别”这类字段建了效果很差。4.3 事务的ACID保证数据不“半身不遂”事务是关系型数据库最伟大的发明之一。一个事务就是一组操作要么全部成功要么全部失败回滚不会出现“只执行了一半”的情况。比如转账A扣1000B加1000这两步必须在一个事务里完成。如果第一步成功、第二步失败数据库会自动回滚到操作前状态。事务的特性缩写成ACID原子性Atomicity保证全部成功或全部失败一致性Consistency保证操作前后数据都满足业务规则隔离性Isolation保证多个事务并发执行时互不干扰持久性Durability保证提交后数据不丢失。理解ACID之后你再看“先写数据库还是先写MQ”这类问题就会明白为什么不能简单拍脑袋决定要把数据库操作和发消息放在同一个可靠流程里否则就会遇到“库写了但消息没发出去”的尴尬。4.4 并发锁与死锁两个事务打架的解决思路当多个事务同时操作同一行数据时就需要锁来避免冲突。数据库有两种常见的并发控制思路悲观锁和乐观锁。悲观锁认为冲突一定会发生操作前先锁住数据乐观锁认为冲突很少发生通过版本号或时间戳在提交时校验。MySQL的InnoDB默认使用MVCC让读操作不阻塞写操作大幅提升并发能力。死锁则是两个事务互相持有对方需要的资源谁都没法推进。比如事务A锁了行1还要锁行2事务B锁了行2还要锁行1两者就僵住了。数据库通常会检测到死锁并强制回滚其中一个事务但应用程序要做好重试。想减少死锁常见做法包括所有事务都按相同顺序访问资源、尽量把事务做短、用更精准的索引减少锁范围。等你实际遇到死锁日志的时候不妨先打印出两个事务的SQL和执行计划往往很快能定位到问题。4.5 连接池为什么连接这么贵很多初学者不理解为什么程序里要用数据库连接池。直连数据库不行吗每次访问都建立连接、执行SQL、关闭连接不是很简单吗问题是“建立连接”的成本很高它要经过网络握手、身份认证、分配资源等多个环节反复创建销毁会严重拖慢性能还可能把数据库服务器拖垮。连接池的思路就是提前建好一批连接放在池里谁要用就借一个用完还回池里而不是关闭。像Java里常用的HikariCP、Druid功能就是干这个的。配置连接池时要关注最小连接数、最大连接数、连接超时、空闲回收等参数。最大连接数太小高并发时请求会排队太大数据库可能承受不住。这个参数没有标准答案要根据业务流量压测调整。5. 新手最容易摔的五个跟头5.1 把数据库当成大号Excel设计全凭感觉我见过有人给用户表建了30多个字段包括手机号、座机号、微信号、QQ号、备用电话1、备用电话2……每个都能为空很多还是重复信息。这种“一张表走天下”的思路在Excel里没问题但在数据库里会带来大量冗余和更新异常。正确做法是先做基础的数据建模梳理实体、属性、关系再决定拆成几张表、每张表放什么字段。数据库课程设计里常说的ER图画起来虽然烦但真能帮你少走弯路。5.2 GROUP BY报错、重复数据、idb文件误删这几个问题我几乎每周都能在社区里看到。MySQL里GROUP BY报错通常是因为启用了ONLY_FULL_GROUP_BY模式查询列没有全部出现在GROUP BY子句里。解决办法不是直接关掉模式而是先想清楚你想按什么维度聚合。至于重复数据关键不在写一遍“去重SQL”就完事而是要从源头加唯一约束在应用层控制并发重复提交否则数据早晚还会脏回去。还有朋友会问“数据库idb文件是什么误删了还能恢复吗”.idb文件是MySQL InnoDB引擎的表数据文件属于物理文件。平时做备份很多人只导出SQL脚本忽略了物理文件备份。真到了服务器磁盘坏掉的时候你会发现只有SQL脚本还不够至少要有全量备份加二进制日志才能把数据库恢复到崩溃前的最后一刻。5.3 先写数据库还是先写MQ顺序问题没那么简单这个问题在分布式系统里很经典。你有一个创建订单的操作既要写订单表又要发一条消息到消息队列让下游服务处理。如果先写数据库、发消息时失败下游永远不知道有新订单如果先发消息、写数据库失败下游可能去查一个不存在的订单。两类错误都会出现。入门阶段你不需要立刻给出完美答案但要知道现在业界有几种通用解法本地消息表、事务性消息、Outbox模式。核心思路是先把真正的业务数据落库再通过一个可靠的中间过程把“发消息”这件事也变成可控的保证最终一致。等你有一定并发和分布式基础后再回头看这些方案就顺很多。5.4 遇到“软件访问数据库报错”先别慌有相当多的报错不是程序代码的问题而是环境配置问题。比如Multisim访问数据库发生错误、Eplan部件库存储数据库连不上这类桌面软件常自带一个小型数据库。报错原因通常是缺少对应数据库驱动、版本不匹配、数据库文件损坏、权限不足、安装了多个版本导致ODBC注册混乱。排查思路很简单先看报错信息里有没有“driver”“connection”“path”这类关键词再检查软件配置里的数据库路径是否正确然后确认电脑上有没有装对应的数据库引擎最后看是不是杀毒软件把数据库组件隔离了。一半以上的“数据库错误”都能在这一步解决不用急着重装系统。5.5 不要盲信“40个核心”这类江湖传言网上经常流传“数据库只能使用40个核心”“单表超过XX万行就必须分库分表”之类的说法。这些话大多是把特定版本、特定配置、特定业务场景下的经验硬套成了普遍规律。数据库能用到多少核取决于授权限制、存储引擎、并发模型和硬件环境单表能到多少行也取决于字段结构、索引和查询特点。我用过一些数据库单表几亿行依然跑得不错前提是索引合理、查询条件覆盖索引、不做无谓的全表扫。所以听到任何“绝对结论”时先问一句它适用的场景是什么它的依据是什么有了这个习惯你在技术路上能少走很多冤枉路。6. 给初学者的务实学习路线6.1 先会CRUD再谈优化数据库的基本操作就是增删改查CRUD对应SQL里的INSERT、SELECT、UPDATE、DELETE。这一步不需要任何高深理论找一套数据库建几张表往里面塞数据再写各种查询条件直到熟练为止。你可以去下个开源的“北风数据库”这类示例库里面已经有完整的表结构和数据非常适合练习。等你能不看参考资料写出手游里“查用户”“改订单状态”这些常见操作第一关就算过了。6.2 用一个数据库课程设计级别的项目练手“数据库课程设计”听上去像作业其实是很好的综合练习。比如做一个图书管理系统需要设计读者表、图书表、借阅记录表要处理“借书时库存减一”“还书时逾期天数计算”这些业务逻辑还要考虑同一本书同时多个人借会不会超卖。把这些做完你对主键、外键、索引、事务的理解会从“背概念”变成“有手感”。练手期间可以强迫自己用DBeaver或dbx这样的数据库管理工具学会建库、建表、看ER图、导出脚本。考试或面试时经常让你“用SQL建表并插入数据”这门手艺只要练过短期都不会忘。6.3 从背概念到拆原理的进阶路径当你不再怕写SQL再回头看数据库内核相关的内容B树的查找过程、InnoDB的日志怎么保证崩溃恢复、MySQL主从复制和同步软件的原理、连接池参数怎么调优、执行计划为什么选这个索引。这时候你会发现之前很多“玄学报错”都有了合理的解释。过了基础阶段你可以进一步学习数据库同步与高可用方案比如主从复制、读写分离、Canal或DataX这类数据同步工具以及数据库死锁的完整排查链路。这些内容我在后续的“初识数据库下”里会详细展开你先把上面的基本功打好到时候听会更轻松。我自己的体会是数据库这门技术最忌讳的就是整天背概念、看教程却不动手碰真实数据。你亲手建一张有外键的表亲手把一条UPDATE语句在事务里来回提交和回滚一遍比看十篇文章都有用。遇到报错也别怕认真看日志、拆解原因、查官方文档慢慢就会建立起属于自己的调参直觉。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价