黑色星期五之夜马卡龙模组(FNF VS Retrospecter Optimized)
40.29M · 2025-10-19
上次线上查用户订单,我写了句 select * from order where user_id=123,结果等了 18 秒 —— 产品经理在旁边盯着,我手心全是汗。后来 DBA 扔来一句:“没建索引?全表扫描 100 万行,不死才怪!”
这就像你找一本没贴标签的书,得从书架第一本翻到最后一本;而索引,就是图书馆的 “检索架”,直接告诉你书在第几排第几层。
官方定义太绕,直白说:给数据贴的 “导航标签” 。比如给user表的user_id建索引,数据库查user_id=123时,不用扫全表,直接通过索引定位到数据所在的 “磁盘地址”,一秒搞定。
核心就一个:减少 IO 次数。
毕竟磁盘 IO 是 “慢动作”,少一次就快一截。
说穿了就是 “空间换时间” 的权衡 。
索引本身也是数据,要占磁盘空间(比如 100 万行的表,一个索引可能占 20MB),但换来了查询速度的飞跃。就像你给笔记本做笔记,笔记占页数,但复习时不用重看全书 —— 这买卖不亏。
大部分数据库(MySQL、PostgreSQL)的索引用B + 树,这玩意儿像 “倒过来的树”,分三层:
查user_id=666时,路径是:根节点→中间节点(501-1000)→叶子节点(666 的地址),3 步到位,不用扫全表。
别慌!大概率是这 4 个坑:
解决:用 EXPLAIN 看执行计划, key 字段为 NULL 就是没用到索引。
绝对不是!索引多了,写入会变慢。
比如你给order表建了 5 个索引,插一条数据时,不仅要改表数据,还要同步更新 5 个索引文件 —— 相当于你写一篇文章,要同步发 5 个平台,能不慢吗?
建议:一张表建 3-5 个索引,够用就行。
面试必问!联合索引就是多个字段一起建的索引(比如(name, age, gender)),最左前缀原则是:
必须从索引的 “最左边” 字段开始用,不然索引失效。
比如:
简单记:联合索引像糖葫芦,得从第一个糖球开始吃,不能跳。
核心原则:过滤性强的字段放前面。
过滤性强 = 字段取值重复率低,比如name(每个人名字不同)比age(很多人 25 岁)过滤性强,所以(name, age)比(age, name)好。
另外,常出现在 where 里的字段放前面,比如每次查都带name,就把name放第一。
覆盖索引 =索引包含了查询需要的所有字段,不用再 “回表” 查数据。
比如建了(name, age)索引,查select name, age from user where name='张三',直接从索引里拿数据,不用再去主键索引(聚簇索引)找全行数据 —— 少一次 IO,速度直接翻倍!
MySQL 执行计划里的 “Using index”,就是用到了覆盖索引,这是优化的大杀器。
有坑!但不是不能存 NULL:
建议:给索引字段设默认值(比如默认 0、默认空字符串),别让它为 NULL。
索引的 “有序性” 能帮排序 / 分组省大事!
比如建了age索引,查select * from user order by age,数据库直接按索引顺序取数据,不用额外 “文件排序”(filesort);如果没索引,就得先查数据,再放内存排序(数据多了还得写临时文件,贼慢)。
注意:排序字段要和索引顺序一致,比如索引是 age asc ,别用 order by age desc ,不然可能失效。
用EXPLAIN分析执行计划,看这 3 个关键点:
另外记几个常见失效场景:索引字段用函数、用!=/not in、字符串没加引号(比如name=123,实际name是 varchar)。
分 4 步走,别等出问题再搞:
别只懂 MySQL,面试官可能问跨库差异:
数据库 | 索引类型 | 核心特点 |
---|---|---|
MySQL(InnoDB) | B + 树索引 | 聚簇索引(存数据)+ 二级索引(存主键) |
MySQL(MyISAM) | B + 树索引 | 非聚簇索引,索引和数据分开存 |
Oracle | B 树 / 哈希 / 位图 / 函数索引 | 支持函数索引(如upper(name)) |
MongoDB | B 树 / 地理空间 / 文本索引 | 适合非结构化数据,支持文本检索 |
索引不是 “建了就完事”,而是要 “跟着业务调”。比如业务从 “查 name” 变成 “查 age”,就得及时加 age 索引、删没用的 name 索引。
如果老铁们有索引踩坑经历,或者想深入了解 “聚簇索引 vs 非聚簇索引”,评论区喊我,下次专门写一篇!
觉得有用的话,点赞 + 收藏,面试前翻出来看,准能少慌一会儿~
40.29M · 2025-10-19
113.98MB · 2025-10-19
48.33M · 2025-10-19