mysql知识点打卡《一》
知识点一:EXPLAIN执行计划 - 你的SQL性能“体检报告”
核心概念:
EXPLAIN是MySQL自带的SQL性能分析神器。在SELECT语句前加上 EXPLAIN ,就能看到MySQL是如何执行这条SQL的,就像给SQL做了一次全面体检。
关键指标解读(看报告重点):
- type(访问类型):这是判断查询效率的关键。
- ALL(全表扫描):最差,需要扫描整张表。 type=ALL 就是性能警报!
- index(全索引扫描):比ALL好一点,但也是扫描整个索引树。
- range(范围扫描):使用了索引进行范围查找(如 > , < , in , between )。
- ref(非唯一索引扫描):使用普通索引进行等值查询。
- eq_ref(唯一索引扫描):多表关联时,使用主键或唯一索引进行关联。
- const(常量查询):通过主键或唯一索引一次就找到,性能最佳。
- key(实际使用的索引):显示MySQL最终决定使用哪个索引来查找。如果这里为 NULL ,说明没用到索引,需要优化。
- rows(预估扫描行数):MySQL认为执行此查询需要扫描多少行。这个值越小越好。
- Extra(额外信息):包含非常重要的执行细节。
- Using index:使用了“覆盖索引”,所有需要的数据都在索引中,无需回表,性能极佳。
- Using filesort:需要额外的排序操作,可能没有用到索引排序,是性能瓶颈信号。
- Using temporary:使用了临时表,常见于 GROUP BY 、 DISTINCT 等操作,需警惕。
一句话总结:
“ EXPLAIN 就是SQL的体检单, type 看方法, key 看用了啥, rows 看工作量, Extra 看有没有‘加班’(额外开销)。”
实用建议:
写完复杂SQL后,养成习惯先用 EXPLAIN 看一下执行计划。如果发现 type 是 ALL 或 index , rows 数值巨大,或者 Extra 出现了 Using filesor t / Using tempora ry ,就要考虑优化索引或重写SQL了。
知识点二:最左前缀原则 - 联合索引的“通关密码”
核心概念:
当你在多个列上建立了一个联合索引(例如 INDEX (a, b, c) ),这个索引的使用就像一串密码,必须从最左边的列开始按顺序使用,才能生效。
原理详解:
联合索引的B+树是按照索引定义的列顺序来构建的。先按 a 排序, a 相同再按 b 排序, b 相同再按 c 排序。
- ✅ 能用到索引的情况: WHERE a = ? 、 WHERE a = ? A ND b = ? 、 WHERE a = ? A ND b = ? AND c = ? 。因为查询条件从最左列 a 开始匹配。
- ❌ 不能用到索引或只用部分的情况:
- WHERE b = ? (跳过了 a ,索引失效)
- WHERE b = ? A ND c = ? (跳过了 a ,索引失效)
- WHERE a = ? A ND c = ? (只能用到 a 列, c 列无法用于过滤,因为中间断了 b )
一句话总结:
“联合索引像一串钥匙,你必须从第一把(最左列)开始按顺序用,跳着用或者从中间用,门都打不开。”
实用建议:
- 设计联合索引时,把区分度高(唯一值多)且最常被查询的列放在最左边。
- 写 WHERE 条件时,尽量按照联合索引的列顺序来写。
- 如果查询条件经常跳过最左列,需要考虑为后面的列单独建立索引。
知识点三:覆盖索引 - 让查询“一步到位”的神技
核心概念:
如果一个索引包含了查询所需要的所有字段,那么MySQL只需要扫描索引就能拿到结果,无需回表去主键索引(聚簇索引)里查找数据行。这就叫“覆盖索引”。
为什么要避免“回表”?
普通索引(二级索引)的叶子节点只存储了索引列的值 + 主键ID。如果查询的字段不在索引中,MySQL就需要先用索引找到主键ID,再根据ID去主键索引里查找整行数据,这个过程就是“回表”。多一次查找,性能就下降。
覆盖索引如何工作?
例如,表 user 有 id (主键), name , age , city 。
- 你有一个查询: SELECT id, na me FROM user WHERE name = ‘张三‘;
- 如果你为 (name) 建立了索引,这个查询就需要回表,因为索引里没有 age 和 city (虽然 id 在主键索引里,但普通索引叶子节点包含 id ,所以 id 和 name 都在索引里了,本例其实已经是覆盖索引)。
- 更典型的例子: SELECT age FR OM user WHERE city = ‘北京‘;
- 如果只有 (city) 索引,需要回表取 age 。
- 如果你建立的是 (city, age) 联合索引,那么 city 和 age 都在这个索引的叶子节点里,查询时直接在索引里就能拿到 age ,无需回表,速度飞快。
一句话总结:
“覆盖索引就是‘一站式服务’,索引里啥都有,查完直接返回,不用再去主键索引‘仓库’里翻箱倒柜。”
实用建议:
- 高频查询的SQL,尽量使用覆盖索引。在建立联合索引时,可以把查询中需要返回的列也加进去。
- 避免使用 SELECT * ,只查询需要的列。这样更容易让现有的索引成为覆盖索引,或者为设计覆盖索引创造条件。
- 用 EXPLAIN 查看SQL时,如果 Extra 列显示 Using index ,恭喜你,用上了覆盖索引!
浙公网安备 33010602011771号