Principes des bases de données dans easy-vibe : Index, Transactions et Optimisation SQL
【免费下载链接】easy-vibe💻 vibe coding 101|The first course for AI-native product builders.项目地址: https://gitcode.com/GitHub_Trending/ea/easy-vibe
导读:本篇技术指南是 easy-vibe 课程体系中「数据」板块的核心章节,系统讲解数据库从「是什么」到「怎么用」再到「怎么优化」的完整链路:为什么数据规模变大后 Excel 不再够用、表/行/列/主键/外键如何组织数据、SQL 的 CRUD 与 JOIN 实战、索引与 B+ 树的提速原理、事务与 ACID 四性,以及可以直接落地的性能优化模板。读完本文,你将掌握数据库选型判断力、标准 SQL 实操能力,以及让查询快上千倍的索引与事务调优方法论。
1. 动机与理由:为什么需要「数据库」
1.1 从街角小书店到 Amazon:数据规模演进带来的问题
设想你经营一家小书店,每天卖出几本书,用笔记本记账完全够用:
2024-01-15 : Jean 购买了《百年孤独》,59 欧元 2024-01-16 : Marie 购买了《人的境况》,39 欧元但当你的书店成长为每天百万订单的「Amazon」时,问题随之而来:
- 数据量:不再是几十行,而是数亿行;
- 并发访问:不再是单人查询,而是数百万用户同时访问;
- 数据间关系:订单关联用户、商品、库存、物流……需要高效管理复杂关系;
- 数据安全:断电绝不能清空所有订单。
📓 Excel / 笔记本
- 适合个人或小团队
- 数据量:几千到几万行
- 单用户、顺序访问
- 手动查找,速度慢
🗄️ 数据库
- 适合企业级应用
- 数据量:数亿行以上
- 数百万用户同时在线
- 毫秒级查询
数据库要解决的核心问题正是:如何高效存储、快速查询、安全地管理海量数据?
1.2 一个真实的故事:为什么别把用户数据存在 Excel 里
你可能会说:「我的项目只有几万用户,Excel 难道不够吗?」来看一个真实案例。
::: warning Lucas 的遭遇 Lucas 发布了一款社交应用。起初用户不多,他把用户信息(姓名、电话、注册日期等)都存在 Excel 里,每天导出 Excel 观察增长,一切正常。
当用户数突破 10 万后,问题开始出现:
- Excel 打开需要 5 分钟;
- 筛选「巴黎用户」直接让应用卡死;
- 有一次 Excel 文件损坏,数千条用户数据永久丢失。
更致命的是:他想实现「查看某用户的所有订单」功能——但用户信息和订单在两个不同的 Excel 文件里,只能手动复制粘贴,每次要花半小时。
他请教了一位前辈。前辈看了看,笑了:「你需要的不是 Excel,而是数据库。」
切换到数据库后,一切都不一样了:
- 「巴黎用户」查询只需 0.01 秒;
- 借助「关系」,用户与订单自动关联——一条 SQL 语句即可完成;
- 数据自动备份——再也不用担心文件损坏。
Lucas 悟出一个真理:数据量小的时候,什么工具都能用;数据量大了,Excel 就是灾难。:::
::: info 💡 关键启示 数据库不是「更复杂的 Excel」,而是基于完全不同的设计哲学:
- Excel:为小数据量、个人使用而设计;
- 数据库:为海量数据、高并发、复杂关系而设计。
选对工具,可以让系统性能提升数千倍。 :::
在 easy-vibe 的 后端分层架构 与 API 设计 课程中,你构建的每一个真实应用最终都要落到数据库层——这正是本节作为数据板块开篇的意义所在。
2. 核心概念:表、行、列、主键
::: tip 🤔 这些概念和数据库有什么关系? 表、行、列、主键是数据库的「积木」。
想象你在盖房子:
- 表= 一个房间(存放一类数据)
- 行= 房间里的一只箱子(一条完整记录)
- 列= 箱子上的标签(姓名、年龄等)
- 主键= 箱子的唯一编号(绝不重复)
理解这些基础概念,是掌握数据如何组织的第一步。 :::
2.1 用图书馆的比喻理解数据库结构
走进一座图书馆,你会发现它的组织方式与数据库惊人地相似:
| 概念 | 📚 图书馆比喻 | 实际作用 | 具体例子 |
|---|---|---|---|
| 数据库(Database) | 整座图书馆 | 存放所有数据的容器 | 电商网站数据库 |
| 表(Table) | 一个书架 | 同类型数据的集合 | 用户表、商品表、订单表 |
| 列(Column) | 书脊上的标签 | 数据的属性(字段) | 姓名、年龄、电话号码 |
| 行(Row) | 书架上的每本书 | 一条具体的数据记录 | 「Jean,25 岁,巴黎」 |
| 主键(Primary Key) | 每本书的 ISBN 号 | 唯一标识每一行的 ID | user_id = 1001 |
具体示例:用户表(users)
| user_id (主键) | name | age | city | |
|---|---|---|---|---|
| 1001 | Jean | 25 | Paris | jean@example.com |
| 1002 | Marie | 30 | Lyon | marie@example.com |
| 1003 | Pierre | 28 | Paris | pierre@example.com |
- 表:
users(存放所有用户数据) - 列:
user_id、name、age、city、email(每个用户的属性) - 行:每一行是一个用户(例如「Jean,25 岁,巴黎」)
- 主键:
user_id(1001、1002、1003 —— 绝不重复)
2.2 主键(Primary Key):数据的「身份证号」
::: tip 📖 什么是主键?主键是表中每一行的唯一标识,就像身份证号。
关键特征:
- 唯一性:绝不重复(两个人不可能有同一个身份证号)
- 非空性:必须有值(不存在「没有身份证号的人」)
- 不变性:一旦确定就不改变(你的身份证号不会变)
常见做法:
- 使用自增整数:1, 2, 3, 4...
- 使用 UUID(通用唯一标识符):
550e8400-e29b-41d4-a716-446655440000:::
为什么需要主键?想象一个没有主键的世界:
场景:你想修改「Jean」的年龄,但表里有 3 个「Jean」。系统该改哪个?
-- 没有主键:会修改所有叫 Jean 的人! UPDATE users SET age = 26 WHERE name = 'Jean'; -- 有主键:精确修改 UPDATE users SET age = 26 WHERE user_id = 1001;主键黄金法则:每张表都必须有主键,且主键永远不应被修改。
2.3 外键(Foreign Key):表与表之间的桥梁
这是数据库优于 Excel 的关键所在——表与表之间可以建立关联。
::: tip 📖 什么是外键?外键是一个指向另一张表主键的列,用于建立表之间的关联。
简单理解:
- 主键 = 我的身份证号
- 外键 = 我引用别人的身份证号
示例:订单表中的user_id字段就是指向用户表主键的外键。 :::
具体例子:
用户表(users):
| user_id (主键) | name | phone |
|---|---|---|
| 1001 | Jean | 06xxxx |
| 1002 | Marie | 07xxxx |
订单表(orders):
| order_id (主键) | product_name | price | user_id (外键) |
|---|---|---|---|
| 5001 | iPhone 15 | 5999 | 1001 |
| 5002 | MacBook | 14999 | 1001 |
| 5003 | AirPods | 1999 | 1002 |
关键理解:
- 订单表中的
user_id = 1001指向用户表中user_id = 1001(即 Jean); - 当查询「订单 5001 是谁下的」时,数据库会自动到用户表中查找
user_id = 1001的用户。
优势:
- 不重复存储数据:即使 Jean 买 100 件商品,他的信息在用户表中只存一次;
- 易于维护:Jean 换了电话号码,只需修改用户表,所有订单自动关联新号码;
- 灵活查询:「每个用户总共花了多少钱」这类复杂问题变得易如反掌。
3. 方法与实践:用 SQL 与数据库对话
你不能直接用鼠标「点击」数据库(虽然有图形化工具,但它们本质上是把点击转换成命令)。你需要一种专门的语言来给数据库下指令。
这种语言叫SQL(Structured Query Language,结构化查询语言)。
好消息是:SQL 非常接近自然英语,读起来几乎像在说话。
3.1 SQL 的基本操作:CRUD
大多数时候,你只需要掌握四种操作,业内称为CRUD:
| 操作 | 英文 | SQL 关键字 | 简单解释 |
|---|---|---|---|
| Create | 创建 | INSERT | 新增一条数据 |
| Read | 读取 | SELECT | 查询数据 |
| Update | 更新 | UPDATE | 修改数据 |
| Delete | 删除 | DELETE | 删除数据 |
::: tip 📊 这个表格告诉我们什么? 这四种操作覆盖了所有数据处理场景:
- Create:用户注册时,插入一条新的用户记录
- Read:登录时,校验用户名和密码
- Update:用户修改个人资料时,更新表中的数据
- Delete:用户注销账号时,删除其数据
记住这四种操作,你就掌握了 80% 的日常 SQL。 :::
3.2 查询数据(SELECT):最常用的操作
查询是数据库最重要的功能,也是性能优化的关键。
示例 1:查找所有巴黎用户
SELECT name, age FROM users WHERE city = 'Paris';逐词理解:
SELECT name, age:选择 name 和 age 两列FROM users:在 users 表中WHERE city = 'Paris':满足 city 为「Paris」的条件
结果:
| name | age |
|---|---|
| Jean | 25 |
| Pierre | 28 |
示例 2:查找价格在 5000 到 15000 之间的商品
SELECT name, price FROM products WHERE price BETWEEN 5000 AND 15000;示例 3:模糊搜索(查找姓名包含「Je」的用户)
SELECT name FROM users WHERE name LIKE '%Je%';::: warning ⚠️ 性能陷阱:LIKE 的使用LIKE '%Je%'会引发全表扫描(full table scan),数据量大时非常慢。
优化建议:
- ❌ 不要用
LIKE '%Je%'(前后都有 %) - ✅ 可以用
LIKE 'Je%'(只在后面加 %)
因为LIKE 'Je%'可以用索引,而LIKE '%Je%'无法用索引。 :::
3.3 插入数据(INSERT):新增记录
示例:新增一个用户
INSERT INTO users (user_id, name, age, city, email) VALUES (1004, 'Sophie', 35, 'Marseille', 'sophie@example.com');逐词理解:
INSERT INTO users:插入到 users 表(user_id, name, age, city, email):指定要插入的列VALUES (1004, 'Sophie', ...):对应的值
批量插入(更高效):
INSERT INTO users (name, age, city) VALUES ('Luc', 25, 'Paris'), ('Claire', 28, 'Lyon'), ('Paul', 30, 'Marseille');3.4 更新数据(UPDATE):修改记录
示例:所有巴黎用户的年龄 +1
UPDATE users SET age = age + 1 WHERE city = 'Paris';::: danger ❌ 非常危险:别忘了 WHERE! 如果忘了WHERE子句,你会修改所有行!
-- 危险!这会把所有用户的年龄改成 26 UPDATE users SET age = 26; -- 正确:只修改 user_id = 1001 的用户 UPDATE users SET age = 26 WHERE user_id = 1001;真实教训:2012 年,某知名公司的工程师忘记写 WHERE,导致生产环境数百万条用户数据被错误更新,系统瘫痪 4 小时,损失惨重。 :::
3.5 删除数据(DELETE):删除记录
示例:删除 user_id = 1004 的用户
DELETE FROM users WHERE user_id = 1004;::: danger ❌ 双重危险:DELETE 更需要 WHERE!
-- 危险!这会把表中所有数据删光! DELETE FROM users; -- 正确:只删除指定行 DELETE FROM users WHERE user_id = 1004;最佳实践:
- 删除前先用 SELECT 确认数据;
- 关键系统中使用「软删除」(增加
is_deleted字段标记删除状态); - 生产环境任何操作前先备份数据。 :::
3.6 多表查询(JOIN):数据库的高光时刻
还记得前面讲的「外键」吗?SQL 最强大的地方在于:一条查询就能关联多张表。
场景:查询「Jean 购买过的所有商品」
我们有三张表:
用户表(users): | user_id | name | |---------|------| | 1001 | Jean |
商品表(products): | product_id | name | price | |------------|------|-------| | 201 | iPhone 15 | 5999 | | 202 | MacBook | 14999 |
订单表(orders): | order_id | user_id | product_id | quantity | |----------|---------|------------|----------| | 5001 | 1001 | 201 | 1 | | 5002 | 1001 | 202 | 2 |
SQL 查询:
SELECT u.name, p.name AS product_name, p.price, o.quantity FROM orders o JOIN users u ON o.user_id = u.user_id JOIN products p ON o.product_id = p.product_id WHERE u.name = 'Jean';结果:
| name | product_name | price | quantity |
|---|---|---|---|
| Jean | iPhone 15 | 5999 | 1 |
| Jean | MacBook | 14999 | 2 |
理解 JOIN 的执行过程:
FROM orders o:从订单表开始;JOIN users u ON o.user_id = u.user_id:通过 user_id 关联用户表;JOIN products p ON o.product_id = p.product_id:通过 product_id 关联商品表;WHERE u.name = 'Jean':过滤出 Jean 的订单。
在 easy-vibe 的 数据模型 章节中会进一步看到:关系型数据库擅长用 JOIN 处理结构化业务数据,而当数据形态变成文档、图、时序或向量时,则需要引入其他数据模型来补充。
4. 动机与理由:数据库为什么这么快?索引原理揭秘
这是数据库最迷人的部分,也是面试中最常被问的问题。
如果你在 Excel 里查找「所有名字以 Je 开头的人」,Excel 必须从第一行扫到最后一行的每一条。这就是全表扫描——数据越多越慢。
但在数据库中,即使有 10 亿行,查找也只需几毫秒。
秘密就在:索引(Index)。
4.1 直觉理解:字典的启发
想象你在一本 1000 页的书里找一个词,但没有目录。你会怎么做?
你只能一页一页地翻——这就是全表扫描,平均要翻 500 页。
但如果这本书有字母索引呢?
查找「base de données」这个词:
- 翻开索引,找到以「b」开头的部分;
- 在「b」区段里,找「a」;
- 索引告诉你:第 256 页。
你只用了 3 次查找就找到了!这就是索引查找。
数据库的索引就像书的目录:
- 没有索引:逐行扫描(10 亿行 = 几分钟)
- 有索引:直接跳跃(10 亿行 = 3 次磁盘访问 = 几毫秒)
4.2 全表扫描 vs 索引查找:速度对比
假设一个用户表有 1000 万条记录。
场景:查找user_id = 5 555 555的用户
| 方法 | 过程 | 需要检查的行数 | 预估耗时 |
|---|---|---|---|
| 全表扫描 | 从第 1 行开始,逐行检查 | 平均 500 万行 | 5-30 秒 |
| 索引查找 | 遍历索引树,直接跳到目标 | 3-4 次比较 | 0.003 秒 |
速度差距:数千倍!
::: tip 💡 关键启示 索引不是魔法棒,它是有代价的:
- 占用空间:索引需要额外的存储空间;
- 拖慢写入:每次 INSERT/UPDATE/DELETE 都要同步更新索引。
什么时候建索引?
- 经常出现在查询条件中的列(WHERE、JOIN)
- 数据量大的表(几千行就不需要)
什么时候不建索引?
- 很少被查询的列
- 频繁更新的列
- 小表 :::
4.3 底层数据结构:B+ 树
真正的索引并不是简单的「字母列表」,而是一种精心设计的数据结构,叫做B+ 树(B+ Tree)。
::: tip 📖 什么是 B+ 树?B+ 树是一种「又扁又宽」的树形数据结构:
- 扁:从根到叶子,通常只有 3-4 层
- 宽:每个节点可以存储几百个键
为什么「又扁又宽」?
数据存储在磁盘上,而每次磁盘读取(I/O)都极其缓慢(比内存慢几千倍)。B+ 树的设计目标就是把磁盘 I/O 次数降到最少。
- 3-4 层的高度 = 最多 3-4 次磁盘读取
- 每层存储大量数据 = 保证树不会太高 :::
一个具体例子:
假设 B+ 树每个节点能存 1000 个键:
- 根节点:1000 个键 → 指向 1000 个子节点
- 中间节点:每个存 1000 个键 → 指向 1000 个叶子节点
- 叶子节点:每个存 1000 条真实数据
数据总量= 1000 × 1000 × 1000 =10 亿条数据
树的高度=3 层
这意味着:在 10 亿条数据中查找任何一条,只需3 次磁盘访问!
这就是数据库查询快如闪电的秘密。
5. 事务:如何保证数据不丢失、不损坏
想象春运抢火车票的场景:
- T1 时刻:用户 A 查询,看到「G1234 次列车,还剩 1 张票」
- T2 时刻:用户 B 也查询,看到「还剩 1 张票」
- T3 时刻:用户 A 点击「购买」;系统扣减库存,票卖给 A
- T4 时刻:用户 B 点击「购买」——如果没有保护机制,系统再次扣减库存,把同一张票卖给了 B!
这是一个经典的并发冲突问题。
5.1 什么是事务(Transaction)
事务是一组数据库操作,它们要么全部成功,要么全部失败——不存在「做了一半」的状态。
::: tip 🤖 一个身边的例子银行转账就是典型的事务:
- 从账户 A 扣减 100 欧元
- 向账户 B 增加 100 欧元
如果第 1 步成功但第 2 步失败(比如断电),会发生什么?
- 没有事务:A 账户的钱消失了,B 账户没收到——钱凭空蒸发
- 有事务:系统检测到第 2 步失败,自动回滚(rollback)第 1 步;两个账户都恢复到初始状态
这就是事务的原子性:要么全做,要么全不做。 :::
5.2 事务的四大特性(ACID)
事务有四个特性,缩写为ACID:
| 特性 | 英文 | 含义 | 银行转账示例 |
|---|---|---|---|
| Atomicité | 原子性 | 要么全做要么全不做 | 扣款和入账必须一起成功,不能只扣不增 |
| Cohérence | 一致性 | 数据始终处于合法状态 | 转账前后,两个账户的总额必须不变 |
| Isolation | 隔离性 | 多个事务互不影响 | A 转账过程中,B 只能看到「转账前」或「转账后」的余额,看不到中间态 |
| Durabilité | 持久性 | 一旦提交(commit),数据永久保存 | 转账成功后,即使断电,余额也不会回退 |
::: tip 📊 这个表格告诉我们什么? 这四个特性共同保障数据安全:
- 原子性:防止「做一半的事」(扣了款却没入账)
- 一致性:防止不合逻辑的数据(转账后总额变了)
- 隔离性:防止并发冲突(两个人同时改同一份数据)
- 持久性:防止数据丢失(commit 之后不怕断电)
没有这些保障,银行系统根本无法运转。 :::
5.3 事务隔离级别:安全与性能的权衡
理论上,我们希望事务完全隔离。但完全隔离 = 性能下降(因为需要大量加锁,其他事务只能等待)。
因此数据库提供了四种隔离级别:
| 隔离级别 | 脏读 | 不可重复读 | 幻读 | 性能 | 使用场景 |
|---|---|---|---|---|---|
| Read Uncommitted | 可能 | 可能 | 可能 | 最快 | 几乎不用(数据可能错误) |
| Read Committed | 不可能 | 可能 | 可能 | 快 | 常规业务(Oracle 默认) |
| Repeatable Read | 不可能 | 不可能 | 可能 | 中等 | 银行转账(MySQL 默认) |
| Serializable | 不可能 | 不可能 | 不可能 | 最慢 | 极端严格场景(很少用) |
::: tip 📖 三种「读」分别是什么意思?
- 脏读(Dirty Read):读到另一个事务尚未提交的数据(可能被回滚,数据不准确)
- 不可重复读(Non-repeatable Read):同一事务中,两次读取同一数据结果不同(被其他事务修改了)
- 幻读(Phantom Read):同一事务中,两次查询返回的行数不同(其他事务插入/删除了数据)
具体例子(查询银行余额):
- 脏读:你看到余额 1000 欧元,但另一事务随后回滚了——实际上只有 100 欧元
- 不可重复读:第一次查询显示 1000 欧元,第二次显示 800 欧元(期间被扣款了)
- 幻读:第一次查询显示 5 笔交易,第二次显示 6 笔(新增了一笔) :::
6. 性能优化:让查询快 1000 倍的实战技巧
现在你已经理解了索引和事务的基础概念。但在真实项目中,你还会遇到各种各样的性能问题。
本节给出可以直接落地的优化策略。
6.1 索引失效陷阱指南
::: warning ⚠️ 常见错误:不起作用的索引 很多时候,你明明建了索引,查询却依然很慢——因为索引失效了。
索引失效的常见原因:
- 对索引列使用函数
- 隐式类型转换
- 以 % 开头的 LIKE 查询
- OR 条件(某些情况下)
- 复合索引不满足最左前缀规则 :::
陷阱 1:对索引列使用函数
-- ❌ 错误:对索引列使用函数,索引无法使用 SELECT * FROM users WHERE YEAR(created_at) = 2024; -- ✅ 正确:改写成范围查询,索引可用 SELECT * FROM users WHERE created_at >= '2024-01-01' AND created_at < '2025-01-01';陷阱 2:隐式类型转换
-- 假设 user_id 是 int 类型 -- ❌ 错误:传字符串,隐式转换,索引无法使用 SELECT * FROM users WHERE user_id = '123'; -- ✅ 正确:传对应类型 SELECT * FROM users WHERE user_id = 123;陷阱 3:以 % 开头的 LIKE
-- ❌ 错误:以 % 开头,索引无法使用 SELECT * FROM users WHERE name LIKE '%Jean%'; -- ✅ 正确:以固定前缀开头,索引可用 SELECT * FROM users WHERE name LIKE 'Jean%'; -- ✅ 或者用全文索引(适合文本搜索) SELECT * FROM users WHERE MATCH(name) AGAINST('Jean');6.2 实用 SQL 优化模板
模板 1:分页优化(深分页问题)
-- ❌ 问题:OFFSET 越大,查询越慢 SELECT * FROM orders ORDER BY created_at DESC LIMIT 10 OFFSET 1000000; -- ✅ 方案 1:用上次查询的时间戳作为游标 SELECT * FROM orders WHERE created_at < '2024-01-15 12:00:00' ORDER BY created_at DESC LIMIT 10; -- ✅ 方案 2:用主键做范围查询 SELECT * FROM orders WHERE order_id > 1000000 ORDER BY order_id LIMIT 10;模板 2:批量插入优化
-- ❌ 低效:多条单条插入(多次网络往返) INSERT INTO users (name, age) VALUES ('Jean', 25); INSERT INTO users (name, age) VALUES ('Marie', 30); INSERT INTO users (name, age) VALUES ('Pierre', 28); -- ✅ 高效:一条 SQL 批量插入(一次网络往返) INSERT INTO users (name, age) VALUES ('Jean', 25), ('Marie', 30), ('Pierre', 28);**模板 3:避免 SELECT ***
-- ❌ 低效:返回所有列(包括无用的大字段) SELECT * FROM users WHERE user_id = 1; -- ✅ 高效:只返回需要的列 SELECT user_id, name, email FROM users WHERE user_id = 1;6.3 高并发场景应对策略
| 场景 | 问题 | 解决方案 |
|---|---|---|
| 热点数据 | 某一行被极其频繁地读写,锁竞争激烈 | 使用缓存(如 Redis)+ 读写分离 |
| 秒杀 | 高并发下扣减库存 | 乐观锁 + 库存预加载 + 消息队列削峰 |
| 慢查询 | 复杂查询把数据库拖垮 | 索引优化 + 查询拆分 + 读写分离 |
| 连接耗尽 | 并发请求太多,连接池被占满 | 连接池调优 + 限流 + 服务降级 |
::: tip 💡 关键启示 性能优化的基本原则:
- 先度量,再优化:用
EXPLAIN分析查询计划,找到真正的瓶颈 - 索引优先:80% 的性能问题可以通过索引优化解决
- 减轻数据库负担:能用缓存就用缓存,能异步就异步
- 分而治之:大表拆小表,大查询拆小查询 :::
easy-vibe 的 缓存策略 章节对「热点数据」这一行做了更深入的展开:Redis 读约 1 毫秒、MySQL 磁盘查询约 10 毫秒,通过「先查缓存、未命中再查库」的旁路模式,可以让 95% 以上的请求不触达数据库——这正是本小节「减轻数据库负担」原则的工程化落地。
7. 总结与学习路径
用一张表回顾数据库的关键概念:
| 概念 | 一句话解释 | 解决的问题 | 要点 |
|---|---|---|---|
| 表、行、列 | 数据的组织方式 | 如何存储结构化数据 | 表 = Excel 工作表,行 = 记录,列 = 字段 |
| 主键 | 每行的唯一标识 | 如何精确定位一行 | 唯一、非空、不可变 |
| 外键 | 表与表之间的桥梁 | 如何关联不同表的数据 | 指向另一张表的主键 |
| SQL | 与数据库对话的语言 | 如何插入、查询、修改、删除数据 | SELECT, INSERT, UPDATE, DELETE |
| 索引 | 加速查询的数据结构 | 如何快速找到数据 | B+ 树,减少磁盘 I/O |
| 事务 | 保障数据安全的机制 | 如何防止并发冲突和数据丢失 | ACID:原子性、一致性、隔离性、持久性 |
::: info 结语 数据库是一个广阔而深邃的领域,本文只是入门。如果想继续深入,推荐以下路径:
下一步:
- 动手实践:安装 MySQL 或 PostgreSQL,建表、插数据、写 SQL 查询
- ORM 框架:学习在代码中使用数据库(如 SQLAlchemy、Prisma、TypeORM)
- 索引优化:深入学习复合索引、覆盖索引、索引下推等进阶主题
- 事务原理:理解 MVCC(多版本并发控制)、锁机制与隔离级别的实现
- 分布式数据库:学习分库分表、读写分离、主从复制等架构 :::
在 easy-vibe 的 数据模型 与 数据追踪 等章节中,你会继续看到关系型数据库、缓存与各类数据模型如何在真实产品中协同工作。记住:理论与实践相结合,才是真正的掌握。
【免费下载链接】easy-vibe💻 vibe coding 101|The first course for AI-native product builders.项目地址: https://gitcode.com/GitHub_Trending/ea/easy-vibe
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考