mysql知识点打卡《一》

知识点一:EXPLAIN执行计划 - 你的SQL性能“体检报告”

核心概念:
EXPLAIN是MySQL自带的SQL性能分析神器。在SELECT语句前加上 EXPLAIN ,就能看到MySQL是如何执行这条SQL的,就像给SQL做了一次全面体检。
 
关键指标解读(看报告重点)
  1. type(访问类型):这是判断查询效率的关键。
  • ALL(全表扫描):最差,需要扫描整张表。 type=ALL 就是性能警报!
  • index(全索引扫描):比ALL好一点,但也是扫描整个索引树。
  • range(范围扫描):使用了索引进行范围查找( > ,  < ,  in ,  between )。
  • ref(非唯一索引扫描):使用普通索引进行等值查询
  • eq_ref(唯一索引扫描:多表关联时,使用主键或唯一索引进行关联。
  • const(常量查询):通过主键或唯一索引一次就找到,性能最佳。
  1. key(实际使用的索引):显示MySQL最终决定使用哪个索引来查找。如果这里为 NULL ,说明没用到索引,需要优化。
  1. rows(预估扫描行数):MySQL认为执行此查询需要扫描多少行。这个值越小越好
  1. 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 
一句话总结:
“联合索引像一串钥匙,你必须从第一把(最左列)开始按顺序用,跳着用或者从中间用,门都打不开。”
 
实用建议:
 
  1. 设计联合索引时,把区分度高(唯一值多)且最常被查询的列放在最左边。
  1.  WHERE 条件时,尽量按照联合索引的列顺序来写。
  1. 如果查询条件经常跳过最左列,需要考虑为后面的列单独建立索引。
 

知识点三:覆盖索引 - 让查询“一步到位”的神技

核心概念:
如果一个索引包含了查询所需要的所有字段,那么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 无需回表,速度飞快。
一句话总结:
“覆盖索引就是‘一站式服务’,索引里啥都有,查完直接返回,不用再去主键索引‘仓库’里翻箱倒柜。”
 
实用建议:
 
  1. 高频查询的SQL,尽量使用覆盖索引。在建立联合索引时,可以把查询中需要返回的列也加进去。
  1. 避免使用  SELECT * ,只查询需要的列。这样更容易让现有的索引成为覆盖索引,或者为设计覆盖索引创造条件。
  1.  EXPLAIN 查看SQL时,如果 Extra 列显示  Using index ,恭喜你,用上了覆盖索引!
posted @ 2026-01-05 22:28  余明星  阅读(29)  评论(0)    收藏  举报