ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

数据库基础全攻略:SQL、事务、锁、连接池与实战陷阱

数据库基础全攻略:SQL、事务、锁、连接池与实战陷阱 1. 先弄明白数据库到底在解决什么问题这篇是数据库学习笔记的基础篇。我去年带过好几个刚转行的新手发现大家最常犯的错不是学不会 SQL而是根本没搞清楚数据库这玩意出来是干嘛的。有人把它当成“高级 Excel”有人以为数据库就等于 MySQL 或者 Oracle 那几家商业软件的名字。这两个理解都偏差不小。先花两分钟把底层问题理顺数据库Database本质上是帮你有组织地存数据、按条件快速找数据、并且在多人同时读写时保证数据不错不乱的一套系统。听起来抽象但拆开就三个关键词存储、查询、并发一致性。1.1 从 Excel 到数据库不是替换是质变很多人刚上手时觉得 Excel 也能存表为什么非要数据库我举个实际例子你就懂了。你用 Excel 给小商店记订单一天几十笔完全没问题。但到了几百人同时下单、仓库同步扣库存、财务实时对账的时候Excel 就乱了两个人同时改同一个文件后保存的会把先保存的覆盖掉想按“某个日期某个商品某个区域”组合筛选公式写到怀疑人生。数据库解决的就是这些事。它有明确的表、行、列结构约束能通过 SQL 这种标准化查询语言做任意维度组合筛选更重要的是它有一套事务和锁机制保证多个请求同时改同一行数据时不会互相覆盖、也不会算出负数库存。这里我要强调一点学习数据库第一要务不是背命令而是建立“数据模型”的直觉。看见一个业务场景脑子先想清楚要存哪几张表每张表的主键是什么表和表之间怎么关联这一步想清楚了后面写 SQL 就是水到渠成。1.2 表、行、列和主键数据库的基本世界观关系型数据库RDBMS里最核心的概念就是“表”。表就是一张二维网格行是一条记录列是一个属性。比如一张学生表行是每个学生列是学号、姓名、班级、入学时间。表名通常用名词复数或单数都行规范化命名我在后面的章节会细说。表里必须有一个东西能唯一标识每行记录这就是主键Primary Key。主键最常见的做法是用自增整数 ID也可以用学号、订单号这类业务唯一值。主键有多重要它决定了你能不能准确更新或删除某一行。没有主键的表你在执行 UPDATE 或 DELETE 时只能靠“所有列都匹配”来碰运气这种表在实际工程里和定时炸弹没区别。另外一个必须理解的概念是索引。索引就是你给某些列建的“目录”有了它按这些列查询时就不用全表扫描。比如十万人报名一个活动你要筛出某个学校的人没有索引要扫 10 万行有索引可能只要扫几十行。索引不是越多越好每个索引都有维护成本写操作频繁的表尤其要克制。1.3 说了这么多年 SQL它到底分几类SQLStructured Query Language是和数据库对话的标准语言。它按功能分三类**DDL数据定义语言**负责建表、改表结构比如 CREATE TABLE、ALTER TABLE**DML数据操作语言**负责增删改查比如 INSERT、UPDATE、DELETE、SELECT**DCL数据控制语言**负责权限管理比如 GRANT、REVOKE。你去看网上搜“数据库 SQL”“数据库增删改查”这些词八成问的就是 DML 那四个操作。但我要提醒一句基础篇里最容易忽略、也最容易被面试官问倒的往往是 DDL 和事务相关的东西。很多人写 SELECT 写得飞起连 ALTER TABLE 加一个字段都不会更说不清事务的 ACID 是什么。这就叫基础不牢。2. 数据库不只有 MySQL按场景认认这个大家族热搜里出现一堆名字Oracle、PostgreSQL、达梦、人大金仓、TDengine、MongoDB、Riak、Caché、SQLite、向量数据库……新手一看到这么多名字直接头晕。其实这些名字背后是有清晰分类的你把分类逻辑理清了选型就是一道场景匹配题。2.1 关系型数据库主流MySQL、PostgreSQL、Oracle 和国产阵营关系型数据库是目前最普及的种类。MySQL是开源社区的事实标准中小型项目首选生态完善网上教程最多绝大多数人的第一份工作接触的就是它。PostgreSQL这两年风头很猛功能更丰富支持更复杂的数据类型、更严格的标准兼容很多人形容它是“开源界的 Oracle”。Oracle是商业数据库的老牌霸主金融、电信这类对稳定性要求极高的核心系统大量使用特点是强大但贵而且运维复杂度高。国内还有一个越来越常见的阵营达梦数据库和人大金仓这类国产数据库。它们改变了此前很多政企项目完全依赖国外商业数据库的局面。说实话你如果未来要做信创相关项目或者进银行、国企的信息部门对达梦的安装和基础 SQL 操作要有概念。达梦的语法整体上和 Oracle 比较接近学会 Oracle 再上手达梦会快很多。选型时有个常见误区以为“性能最强”的数据库最好。实际项目中选型更看重团队熟悉度、运维成本、周边生态。一个人都没用过 PostgreSQL 的团队为了某个高级特性强行切过去最后往往得不偿失。2.2 场景型选手TDengine 这类时序数据库数据不全是表格化的业务数据还有一类是按时间持续产生的“时序数据”比如设备传感器读数、服务器监控指标、股票行情。这类数据的特点是写多读少、数据量巨大、查询总是带着时间范围。TDengine就是专门为时序数据设计的数据库。它把时间戳、设备 ID 和若干数值字段组织成一类特殊表结构写入和聚合查询都做了深度优化。我在一个工业项目里用过 TDengine 存设备振动数据同一批数据如果往 MySQL 里硬塞查询时按时间范围聚合要跑好几秒TDengine 毫秒级就出来了差距非常明显。如果你用 C 对接 TDengine千万别用拼 SQL 字符串的方式写数据要用它提供的参数绑定接口taos_stmt_prepare。理由两个一是性能绑定方式可以批量提交吞吐量高一个数量级二是安全避免拼接字符串时引号、特殊字符把 SQL 搞坏。这就是热搜里“TDengine, c绑定写入数据库”那几个词指向的内容。2.3 文档型与键值型MongoDB、Riak、Caché 各自的位置MongoDB是非关系型数据库里最出名的属于文档型。它有三个核心概念数据库Database、集合Collection、文档Document。你可以把集合理解成关系库里的“表”把文档理解成“行”但文档是灵活的 JSON 结构——每行可以有不同字段。适合字段多变、快速迭代的业务比如早期创业产品的用户画像。Riak属于键值型数据库存储简单、高可用、扩展性好适合存储会话信息、缓存类数据但在复杂查询上很弱。Caché则是老牌医疗信息化领域常用的数据库有一套独特的多维数据模型熟悉它的人不多但医疗行业存量系统里很常见。普通开发者知道它们存在、知道各自擅长的场景就够了不用逐个深入。2.4 嵌入式数据库 SQLite 与新生代向量数据库和托管服务SQLite是嵌入式数据库里的明星。它不需要独立安装服务就是一个单文件数据库.db 或 .sqlite3整个数据库就在一个文件里便携到离谱。Linux 下很多单文件工具、移动端 App 本地存储都用它。Android Studio 里开发本地存储功能底层走的也是 SQLite。想在上面图形化管理网上搜“SQLite 用哪个管理打开”时会看到一个开源跨平台工具DB4SDB Browser for SQLite免费开箱即用我后面第四章会再提。向量数据库是这几年 AI 风口带火的新物种。它专门存“向量”也就是把文字、图片、音视频用模型转成的一串数字数组通过计算向量距离做相似度检索支撑大模型的知识库和推荐系统。常见的像 Milvus、Pinecone、Weaviate 这一批。基础阶段你不需要深入但要知道它和传统关系型数据库是不同赛道。最后说一句托管数据库服务。云厂商把 MySQL、PostgreSQL 这类数据库做成“开箱即用”的服务你不用自己维护服务器和数据文件点几下就能创建一个实例。中小团队起步阶段全在跑这个热度词里“托管数据库服务”搜的就是这个方向。它的本质没变底层依然是那些你正在学的数据库引擎。3. SQL 基础操作增删改查与表结构修改说回基础篇最硬核的部分SQL 操作。这四个动词——增、删、改、查——看似简单细节里全是坑。我按实际使用频率把最核心的操作串一遍顺带讲几个新手几乎必踩的坑。3.1 建表与四类基础操作的标准姿势先建表。以学生表为例CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT, student_no VARCHAR(20) NOT NULL UNIQUE, name VARCHAR(50) NOT NULL, class_name VARCHAR(50), enroll_date DATE DEFAULT (CURRENT_DATE) );这里要养成的习惯能用数字主键就尽量用自增数字业务编号比如学号用 UNIQUE 约束而不是当主键字段长度要根据业务真实需求定别一上来就 VARCHAR(255)那是对存储空间的浪费。查询是最频繁的操作基础格式长这样SELECT id, name, class_name FROM student WHERE class_name C1001 ORDER BY id DESC LIMIT 20;执行顺序我建议基础阶段就记牢先 FROM 确定数据源再 WHERE 过滤行再 SELECT 投影列再 ORDER BY 排序最后 LIMIT 截断。不少人写复杂查询时逻辑混乱就是因为没理解 FROM→WHERE→SELECT 的顺序。插入、更新、删除相对简单INSERT INTO student (student_no, name, class_name) VALUES (T20250001, 张三, C1001); UPDATE student SET class_name C1002 WHERE id 5; DELETE FROM student WHERE student_no T20250001;三个关键提醒UPDATE 和 DELETE 语句一定要带 WHERE且 WHERE 条件最好走唯一索引。不带 WHERE 的后果是批量清空整张表新手常在测试库上演惨剧。另一个提醒是 DELETE 删除的是行数据不是表结构表还在别混淆——我在后面的 DDL 部分会讲 DROP 和 TRUNCATE 的区别。3.2 修改表结构时的经典翻车给已有重复数据的列加唯一约束热搜里有一条叫“mysql设置唯一已经有重复数据库”翻译成人话就是给一个已经存在重复数据的列加 UNIQUE 约束结果报错了。这个坑我在带新人时见过至少五次。场景是这样的业务上线几个月email 表里本来没约束有些用户重复注册了两次现在你想起要加唯一约束ALTER TABLE user ADD CONSTRAINT uk_email UNIQUE (email);然后报错Duplicate entry xxx for key uk_email。原因很直接——UNIQUE 约束要求这一列在所有现有行里必须唯一但你的历史数据里已经有重复值了数据库不敢替你做决定只能拒绝执行。解决思路分两步先用分组查询找出重复数据SELECT email, COUNT(*) FROM user GROUP BY email HAVING COUNT(*) 1;和业务确认保留哪一条清理重复数据后再执行 ALTER TABLE。我在项目里通常的做法是保留 id 最小的那条把其他重复记录标记为无效或直接合并。清理的数据量大时先写好备份脚本别手一抖把活数据删了。这事的本质其实是个数据规范性问题约束应该在表设计阶段就加好上线后再补代价巨大。但新手阶段踩一遍这种坑反而能记住数据库的约束不只是“限制”更是一种对数据质量的承诺。3.3 事务与并发一致性多条 SQL 的组合拳事务Transaction把多条 SQL 操作打包成一个原子单元要么全部成功要么全部不做。经典的转账例子A 给 B 转 100 块拆成两步——A 的余额减 100、B 的余额加 100。任何一步失败整个操作回滚钱不会凭空消失。事务有四个性质记下 ACID原子性Atomicity操作包不可分割某一步挂了全部回滚。一致性Consistency事务前后数据状态都合法转完账两个人的余额总和不变。隔离性Isolation两个并发事务不能看到彼此的中间状态。持久性Durability事务刷盘成功断电也不会丢。实际写代码时事务一般长这样START TRANSACTION; UPDATE account SET balance balance - 100 WHERE id 1; UPDATE account SET balance balance 100 WHERE id 2; COMMIT;如果第二条 UPDATE 失败就执行ROLLBACK;。这里想强调一个基础篇就该建立的意识事务不是写复杂业务时才用而是任何一个涉及“多步数据变更”的接口都应该考虑。比如下单操作扣库存、生成订单、扣优惠券这三步任何一个失败前面几步都必须撤销。你不会想看到库存扣了、订单没生成的情况。4. 数据库怎么连客户端、代码与连接池热搜里有一串问题安装了 SQL Server、Navicat 连不上mysql 的数据库连接池是什么sqldb 用什么管理工具打开这些问题归根结底都指向同一个主题——数据库和应用之间的“通联”到底怎么发生的。4.1 客户端连接的本质端口、协议、认证数据库不是在你电脑上双击打开就能用的文件夹它是一个独立进程监听某个端口等你来连接。MySQL 默认 3306PostgreSQL 默认 5432SQL Server 默认 1433。客户端工具Navicat、DBeaver、DB4S 这类做的事就是通过这个端口发数据包按数据库的协议进行交流第一步是验证身份用户名和密码。理解了这个模型你就能理解很多“连不上”的根因——服务没启动、端口被防火墙挡了、用户名密码不对、或者数据库本身只允许本机连接。排查顺序几乎每次都是同一个模板数据库服务进程有没有跑起来网络通不通ping主机再查端口通不通账号能不能从你这个来源 IP 登录密码有没有过期有些数据库默认策略是 90 天或 180 天过期。顺便说一句网上有人搜“怎么查数据库密码有效期是多久”这就是第 4 步会碰到的事。不同数据库策略不同Oracle 有专门的 profile 管理SQL Server 和 MySQL 也有密码过期策略真连不上时值得查一下这个。4.2 图形化工具怎么选从 DB4S 到 dbx 再到 Navicat基础阶段我强烈建议配一个顺手的管理工具别天天在命令行里死磕。查询、导数据、看表结构图形化工具效率高出一个档次。选型逻辑很简单如果你用的SQLite直接上DB4S开源、跨平台、免费。双击打开 .db 或 .sqlite3 文件就能看表、执行 SQL、导入导出数据网上热搜里那条“db4s: 一个开源跨平台的sqlite数据库管理工具”指的就是它。安装包很小没有花里胡哨的东西。如果你同时连MySQL、PostgreSQL、SQL Server常见选择是 Navicat 或 DBeaver。Navicat 上手丝滑、功能完整但商业收费DBeaver 开源免费适合预算有限的个人学习。热搜里反复出现的dbx 数据库工具我理解是一类通用的数据库管理软件这类工具的共同特点是支持多种数据库、可视化操作、SQL 编辑器一应俱全。选工具的原则不是“越贵越好”而是“你日常接触什么库就选能覆盖它的工具”。另外说个我自己的习惯图形化工具用来查数据、看结构、调试 SQL但从不会用它做正式的线上数据修改。正式变更一律走脚本留痕可回溯。这个习惯能帮你避开无数“手滑事故”。4.3 代码连接数据库与连接池为什么每次新建连接不行学数据库到最后一定绕不开“代码连数据库”。Python 连 MySQL 常用pymysql或mysql-connector-python一个最小示例长这样import pymysql conn pymysql.connect( host127.0.0.1, port3306, userroot, passwordyour_password, databasetest_db ) cursor conn.cursor() cursor.execute(SELECT * FROM student) rows cursor.fetchall() conn.close()如果你照着这个思路在每次请求里都新建一个连接、用完再关闭就是热搜里“MySQL 的数据库连接池”这个词要解决的问题背景——每次建立数据库连接都有成本TCP 握手、认证、分配内存、初始化会话。在高并发接口里每秒几百个请求就意味着每秒几百次新建和销毁连接数据库直接被打满。连接池Connection Pool就是在应用启动时先创建一批连接放进池子里请求来了从池子里取用完了归还。核心参数有三个最小连接数、最大连接数、空闲连接超时时间。Java 生态里的 HikariCP 就是干这个的Python 里也有SQLAlchemy内置的池化机制。这个知识基础篇不用太深但你心里要有这根弦真实生产项目里几乎没有人会裸建连接所有靠谱的框架都自带连接池。你以后看公司代码看到一个配置叫max_pool_size就知道它在说什么了。4.4 一个典型排查过程SQL Server 装好了Navicat 连不上热搜里那条“安装2025sqlserve安装成功了 navichat连接不了数据库”非常典型。装好 SQL Server、Navicat 却连不上95% 的情况出在SQL Server 没有开启 TCP/IP 协议或者只启用了 Windows 身份验证没启用混合验证。SQL Server 默认在安装完成后TCP/IP 网络协议可能还是禁用状态。你需要在“SQL Server 配置管理器”里找到实例的“网络配置”把 TCP/IP 启用然后重启服务。然后是身份验证模式如果你用sa账号或新建 SQL 账号去连需要在实例属性里把“服务器身份验证”改为“SQL Server 和 Windows 身份验证模式”再设置密码。排查这类问题的底层思路是客户端工具只是翻译官它背后走的是数据库网络协议。别拿着工具里的报错一头雾水先确认数据库自己允许网络连接、允许对应账号登录。把链路拆成“数据库端→网络端→客户端”一步步排除大多数连接问题都能在十分钟内定位。5. 并发锁与死锁基础篇绕不开的两座山数据库基础学到中段必然撞上“锁”和“死锁”。这两个概念光看定义很容易晕我换个方式先讲场景再讲机制你会发现数据库的锁没那么玄。5.1 为什么要有锁并发读写的根源冲突想象一个火车票售票系统同一趟车只剩最后一张票。两个用户几乎同时点击“购买”如果数据库不做任何保护两边都读到“剩余 1 张”都执行“减 1”那这张票就可能被卖出去两次。锁的作用就是让“读-判断-写”这个过程原子化第一个用户开始购票时系统锁住这条余票记录第二个用户必须等第一个用户的事务提交后才能读和写。这样余票从 1 变成 0第二个用户看到没票提示失败。数据库的锁有几类分类方式基础阶段掌握两种就够了共享锁S锁别人能读同一行但不能写。用在 SELECT 查询时默认情况下普通 SELECT 不加锁加锁则要显式声明。排他锁X锁锁住后别人既不能写也不能读。用在 UPDATE、DELETE、INSERT 时。此外你还可能听到“悲观锁”和“乐观锁”这对概念。悲观锁就是凡事先锁住再说上图例就是典型乐观锁则是先不锁更新时检查版本号是否发生变化变了说明别人动过了本次更新放弃或重试。高并发读多写少的场景乐观锁更合适“数据库并发锁”话题下搜到的大多是这两种方案的取舍。5.2 死锁是怎么“死”的一个环形等待的经典故事死锁的定义不复杂两个或以上的事务互相持有对方需要的锁谁也不肯放手形成一个环形等待数据库在超时后只能强制回滚其中一个事务。我拿一个具体例子解释。假设有两个事务 T1 和 T2T1先 UPDATE 表 A 某行锁住 A再 UPDATE 表 B 某行需要锁 B。T2先 UPDATE 表 B 某行锁住 B再 UPDATE 表 A 某行需要锁 A。T1 拿着 A 的锁等 BT2 拿着 B 的锁等 A两边都在等数据库没办法自动完成只能靠“检测到死锁→回滚其中一个事务”来解局。这就是热搜里“数据库死锁”这个词指向的经典案例。死锁的几个必要条件可以记住互斥、占有且等待、不可剥夺、循环等待。四个条件同时满足才会死锁所以破局思路就是打破任意一个条件。5.3 基础层面怎么减少死锁三个立竿见影的习惯真实业务里完全消灭死锁不现实但通过几个代码习惯可以极大降低概率第一个习惯多个事务尽量按相同顺序访问资源。所有事务都先访问 A 再访问 B就不会出现交叉等待。这需要团队统一约定属于代码规范级的东西。第二个习惯让事务尽可能短。事务越短持有锁的时间越短和别人碰撞的窗口越小。千万别在一个事务里做外部接口调用、发消息、跑长计算这些操作瞬间拉长锁的持有时间。第三个习惯善用索引。更新、删除操作尽量走索引这样锁定的行数少锁的范围小。如果你没索引数据库可能从行锁升级成表锁整个表都被人占住并发度直接归零。基础阶段做到这三条遇到死锁的概率已经比大多数人低很多了。深度优化隔离级别、锁粒度调优是进阶内容后面边的学习笔记再展开。6. 数据文件、导入导出与环境搭建容易被忽略的实战环节“数据库基础”不等于只会写 SQL。实际工作中Excel 数据导入数据库、导出数据库脚本、手动部署一个 MySQL 实例这些活出现的频率非常高。这一章我把这些零散但实用的东西串起来讲。6.1 数据库在磁盘上到底长什么样先有个直觉认识数据库的数据不是存在云端而是最终落在磁盘文件里。MySQL 的数据文件默认放在一个数据目录下每张使用 InnoDB 引擎的表对应一个.ibd文件——我记得有网友搜“数据库idb文件”大概率就是在找物理文件在哪。SQLite 更直接整个数据库就一个.db或.sqlite3文件移动 App、嵌入式设备本地存储全是这么玩的这也是为什么“Linux 下的单文件数据库”热搜会指向 SQLite。知道数据文件的位置有个直接用途备份。虽然正式的备份要走mysqldump、pg_dump或云端的快照但你学习阶段至少要知道直接拷贝数据文件目录在某些场景比如同版本恢复是能用的。当然生产环境切不可在数据库运行中直接拷贝数据文件那是把数据库弄坏的快捷方式。6.2 把 Excel 数据导入数据库别再做手工复制黏贴“excel导入数据库”和“开源excel数据库软件”这两个热搜词背后是同一个常见需求老板扔给你一张 Excel 表让你导入系统。我在实际项目里处理过无数次。最省事的路径是用图形化工具。Navicat 里选目标表→导入向导→选 Excel 文件→字段映射几秒钟完成。DB4S 对 SQLite 的导入也一样直观。命令行方式也有MySQL 用LOAD DATA LOCAL INFILE但文件里列顺序、逗号/引号转义这些细节相当折磨人新手我会直接推荐用图形化工具带过。导入前有几件事必须确认表结构字段和目标 Excel 列是否一一对应日期格式是否能被数据库识别Excel 里有没有合并单元格和空行。这些不清理导入后数据错乱排查成本比操作本身高得多。6.3 导出 SQL 脚本与示例数据库学习与迁移的双用套路有导入就有导出。导出有两种常见形态整库/整表结构和数据记录。mysqldump导出的就是一个完整 SQL 脚本包含建库、建表、插入数据的语句。用 Navicat 或 IntelliJ IDEA 的数据库面板导出的脚本也同理。这里有个技巧网上搜“idea导出数据库脚本”时大家其实是在找一个可重复执行的迁移文件。我的习惯是把每个版本的表结构变更单独存成一个带版本号的 SQL 文件比如schema_v1.2.sql纯粹改结构就走 DDL 脚本纯粹导数据就走 DML 脚本。这样项目任何人拿到脚本都能一键重建结构不用靠“我把数据库备份文件发你”这种笨办法。学习阶段强烈推荐用一个现成的示例数据库练手比如经典的Northwind北风数据库。它里面有客户、订单、产品、供应商等一套完整的业务表有外键关联有足够的样例数据量拿来做 JOIN、聚合、分组这种练习比自建表高效太多。网上有各种数据库版本的北风数据库下载SQLite 版本的用 DB4S 打开就能跑。6.4 手动部署 MySQL 8.4 LTSwindows 压缩包安装全流程热搜里有条很具体的“mysql 8.4.11 lts数据库服务器的下载、解压及配置”。这个操作非常值得基础篇收录因为学会手动解压配置一个 MySQL你才能真正理解那些一键安装包替你做了什么。Windows 上用 ZIP 包手动部署的流程大致是从 MySQL 官网下载 ZIP Archive 版本8.4 是目前的 LTS 长期支持版稳定性优先学习环境选它没错。解压到目的目录比如D:\mysql-8.4.11-winx64。在解压目录下创建my.ini配置文件指定basedir和datadir例如[mysqld] basedirD:/mysql-8.4.11-winx64 datadirD:/mysql-8.4.11-winx64/data port3306 character-set-serverutf8mb4以管理员身份打开命令行进入 bin 目录执行初始化命令注意这条命令会为 root 生成一个临时密码必须在输出里找并记下来mysqld --initialize --console注册 Windows 服务并启动mysqld --install net start mysql用临时密码登录后立刻修改 root 密码ALTER USER rootlocalhost IDENTIFIED BY 你的新密码;顺手把系统变量里的PATH加上 MySQL 的 bin 目录以后命令行直接敲mysql -u root -p。这套流程里最容易翻车的环节是--initialize之后临时密码没保存好或者my.ini里的路径带中文/空格导致服务起不来。遇到问题别慌看data目录下的.err日志文件MySQL 基本会把具体错误原因写清楚——学会看错误日志是基础篇里最有价值的隐性技能。7. 基础篇学完怎么检验面试题与课程设计是两道试金石基础篇的知识密度到这里已经不小了。最后我想聊聊怎么检验自己是否真的掌握了这些内容因为数据库这行有个特点“看过”和“会做”之间差距巨大。7.1 高频面试题就是最好的自测清单网上搜“数据库面试题”可以看到一大堆高频题但很多列的答案是死记硬背的。我的建议是把那些高频面试题当成自测清单每题都用“讲给一个完全不懂的人听”的方式口述一遍讲不明白就是没真懂。真正常见的几类问题其实都在本文覆盖范围里主键和唯一索引的区别是什么事务 ACID 分别解决什么问题对应我第 3 章的第三节MySQL 索引为什么用 B 树而不是哈希表基础篇可以先只答“范围查询和多列排序友好”数据库死锁是怎么产生的怎么避免对应第 5 章连接池的作用是什么对应第 4 章面试官问这些题不是考你背诵而是考察你有没有建立“底层机制→业务场景→工程选择”这三层思维。比如问死锁他真正想看的是你有没有在生产环境里被死锁折磨过、用什么方法定位和解决。而基础篇的意义就是让这些概念从“听过”变成“能分析”。7.2 找一个小项目做数据库课程设计如果你在学数据库的路上没有目标感我强烈建议找一个“数据库课程设计”题目亲手做一遍。不用复杂比如做一个简单的图书管理系统设计图书表、读者表、借阅记录表写借书、还书、查询的 SQL然后用 Python 或 Java 连上数据库跑通。做完这个你会发现数据库学习百分之八十的价值都在设计阶段表怎么拆、主键外键怎么定、哪个字段该建索引、借书和还书的逻辑能不能用事务包住。SQL 语法反而是最简单的部分遇到不会的函数现查就行。我的个人体会是数据库这门课的“基础篇”学到这程度已经足够支撑你阅读绝大多数业务代码、排查常见问题、完成日常增删改查开发了。至于索引优化、执行计划分析、分库分表、主从复制、数据仓库这些都是建立在“表和 SQL 到底在干嘛”这个底层理解之上的。底层通了后面每学一块都只是在原来的地图上加新地点而已。顺手再分享一个小技巧学数据库时给自己建一个“错误日志”每次遇到报错把错误信息、当时的表结构、排查步骤记下来。这个习惯我保持了好几年比任何教程都有用。因为数据库报错信息其实特别诚实它精确告诉你哪一步出了问题——你只是需要耐心去读懂它。
返回列表