一篇文章讲清楚MySQL的聚簇/联合/覆盖索引、回表、索引下推

诶,这个MySQL索引啊,挺复杂的。
我跟你讲讲。

先说聚簇索引吧。
在InnoDB引擎里,聚簇索引,说白了,就是索引的叶子节点,存了整行数据。
对,就是整行。
一般咱们主键索引就是聚簇索引。
你要是表里没主键,MySQL自己会给你加个隐藏的主键,也用作聚簇索引。
为啥这样呢?因为数据在硬盘上,物理存储就是跟着聚簇索引的顺序放的。
所以,你要是做范围查询,比如查 age BETWEEN 2 0 AND 3 0,那效率就高,因为它可以直接在硬盘上顺序找,不用来回翻。

然后是非聚簇索引。
这个就不同了。
非聚簇索引的叶子节点,它不存整行数据,就存索引字段本身,再加上主键ID。
就省地方了。
但你要查数据,比如查 name = '张三',它先在非聚簇索引里找到 name = '张三' 对应的主键ID,然后拿着这个主键ID,再去“回表”,也就是回到真正的数据表里,用主键ID去查那一行完整的记录。
所以,非聚簇索引查起来,可能比聚簇索引慢一点点,因为它多了这一步。

再说联合索引。
这个就是由多个字段组成的索引,比如 (age, name)。
创建联合索引的时候,字段的顺序很重要。
这个顺序,决定了索引怎么用。
最关键的是“最左匹配原则”。
啥意思呢?就是查询的时候,你用的条件,必须从联合索引的最左边开始匹配。
比如你创建了 (age, name) 这个联合索引,那查 age = 2 5 是可以用索引的,查 name = '李四' 就不能用这个联合索引了,因为 '李四' 不在 (age, name) 的最左边。
查 age = 2 5 AND name = '李四' 就肯定能用。

覆盖索引呢。
这个很厉害。
就是如果你查的字段,正好都包含在索引里了。
比如你有个 (age, name) 的联合索引,你查 SELECT age, name FROM users WHERE age = 2 5 AND name = '李四';,那就能直接用索引里的 age 和 name 得到结果,不用去表里找行了。
这叫“覆盖”,因为它把需要的数据都“覆盖”在索引里了,省事了。

回表查询。
这就是没用到覆盖索引的时候。
比如你查 SELECT FROM users WHERE age = 2 5 AND name = '李四';,假设你只有 (age, name) 这个联合索引,没有 (age, name, gender) 这种覆盖索引。
那它先用 (age, name) 索引找到满足 age = 2 5 AND name = '李四' 的那些行的主键ID,然后拿着这些主键ID,一个个去表里找完整的行数据。
这个从索引找主键,再回表找数据的过程,就叫“回表查询”。

最后说索引下推。
这是MySQL 5 .6 以后有的一个优化。
啥意思呢?就是以前,联合索引里的过滤条件,可能得等到回表之后才能用。
比如 (age, name),查 age = 2 5 AND name = '李四',以前可能得先找到主键ID,回表拿到数据,再在数据里过滤 age = 2 5 AND name = '李四'。
有了索引下推,如果条件里有 age 和 name,并且这两个字段都在联合索引里,那MySQL就可以在索引层面,直接用 age = 2 5 过滤掉很多数据,然后再用 name = '李四' 在剩下的数据里再过滤一下,最后才回表拿那些满足所有条件的主键ID,再去查数据。
这样就减少了回表次数,查得更快。

就这些吧。
聚簇索引,数据直接放那儿。
非聚簇索引,放个指针。
联合索引,多个字段组合。
覆盖索引,查啥字段,索引里就存啥字段。
回表,索引不够用,得回数据表。
索引下推,过滤条件能提前在索引里做就提前做。

说实话,这堆代码看着就头疼。
我在问答论坛混了十年,见过的前端代码多了去了,但像这种把所有JS文件都列出来的,确实少见。
有意思的是,它们用require来管理依赖,还分了pkg和res,看得我有点蒙。

我记得以前做项目时,我们那时候可能用[xss_clean]标签嵌套或者简单的[xss_clean][xss_clean]就搞定了。
现在这搞什么模块化,估计是为了方便维护吧。
不过说实话,这么多文件都写在这,调试起来会不会特别麻烦?我当年调试一个接口问题,就因为一个$.ajax的timeout没调好,折腾了好半天。

数据我记得是2 02 6 年的版权,但建议你核实下,这块我没亲自跑过。
总之,这种前端架构现在挺常见的,就是得慢慢适应。

这段代码是百度知道网站的JavaScript代码,主要功能包括:
1 . 百度统计代码,用于统计网站访问量和用户行为。
2 . 脚本加载和资源映射,用于加载网站的各个组件和资源。
3 . 用户行为跟踪和日志记录,用于记录用户在网站上的操作和浏览行为。
4 . HTTPS支持,用于确保网站的安全性。
5 . 广告加载,用于显示网站的广告。

代码中还包含了以下具体功能:
1 . 意见反馈和投诉举报链接。
2 . 网站版权信息。
3 . 百度知道网站协议。
4 . 用户登录和搜索框。
5 . 页面底部链接。

总之,这段代码是为了实现百度知道网站的正常运作和用户体验。