🗄️ 第七章 用于保护数据库的基础知识-故障恢复与安全措施
📄 一句话概括

慢查询=不报错但要命的语句:结果对、速度慢,用户等得跳脚——治理三步:找出来(慢查询日志)→ 看懂它(执行计划)→ 治好它(索引/改写)。

📝 本节和前面几节的关系

6-5 提过「慢查询是性能侦探」,7-5 刚讲完「报错的病」,本节讲不报错的病:语法全对、结果全对,就是慢。它的特效药是下一节的索引(7-7)——本节负责把病认清楚,下节开药。

一、为什么会慢

二、治理三步

  1. 找出来:开慢查询日志,设阈值(如超 1 秒的记下来)——6-5 仪表的具体用法
  2. 看懂它:EXPLAIN(执行计划)告诉你是全表扫描还是走索引——先诊断再开药
  3. 治好它:加索引(7-7)、改写语句、缩小结果集

三、动手 Demo:见证 100 万行里的一次「全表扫描」

-- 在线运行器造 10 万行(可改小为 1 万)
CREATE TABLE big (id INTEGER PRIMARY KEY, name TEXT, score INTEGER);
-- 省略批量插入(运行器里用递归 CTE 或多次插入)

-- 慢:name 没索引,全表扫描
SELECT * FROM big WHERE name = 'user_9527';

-- 快:id 有主键索引(PRIMARY KEY 自带),瞬回
SELECT * FROM big WHERE id = 9527;

-- 结论:同一张表、同一个量级,索引有无 = 天壤之别

【准备块】在线 SQLite 运行器;数据量视运行器性能调小,结论不变。

四、30 秒实验

把数据库想成图书馆(1-8 的老朋友):全表扫描=为了找一本书把所有书架翻一遍;索引=书脊上的索书号——先查目录卡再直奔书架。你愿意当哪种读者?

五、常见误区

自测三问 1. 慢查询治理三步?(慢查询日志找出来 → EXPLAIN 看懂 → 索引/改写治好) 2. 为什么 `WHERE YEAR(date)=2026` 会拖慢查询?(函数包住列使索引失效,退回全表扫描) 3. 为什么说索引不是免费的?(占空间且每次写入都要同步维护,拖慢 INSERT/UPDATE)

相关笔记