问题一:为什么MySQL用B+树,不用B树或哈希?
哈希索引等值查询快,但范围查询废了,因为哈希值无序。B树每个节点都存数据,树高比B+树高,磁盘IO次数多。B+树只在叶子节点存数据,非叶子节点只存索引,同样磁盘页能塞更多索引项,树更矮,查任何数据都只要两到三次IO。叶子节点还用链表串起来,范围查询直接顺着链表扫。面试官想听的不是“B+树好”,是“为什么好”。答出磁盘IO和范围查询,基本过关。
问题二:聚簇索引和非聚簇索引有什么区别?
聚簇索引的叶子节点存整行数据,非聚簇索引叶子节点存主键值。InnoDB的主键索引就是聚簇索引,一张表只有一个。你给name字段建索引,查name得到主键,再拿主键回聚簇索引捞整行,这叫回表。回表是性能杀手,能避免就避免。怎么避免?用覆盖索引,把要查的字段都放进联合索引里,查完索引直接返回,不回表。面试时能讲清回表代价和覆盖索引,加分。
问题三:联合索引的最左前缀原则是什么?
联合索引(a,b,c),查询条件必须从a开始,跳过a直接用b,索引失效。但有个例外:a用范围查询,b和c就断了。最左前缀的本质是B+树按a、b、c顺序排序,你跳过a,树没法定位。面试常问:where b=1 and c=2能用索引吗?不能。where a=1 and c=2呢?a能用,c用不上。where a=1 and b>2 and c=3呢?a和b能用,c断了。答清楚这个,面试官会点头。
问题四:哪些情况会导致索引失效?
八个典型场景:对索引列做函数运算、隐式类型转换、like以%开头、or连接非索引列、not in和!=、is null和is not null、联合索引不满足最左前缀、数据区分度太低。面试官最爱问“为什么like '%abc'失效”,因为B+树从左到右排序,你从中间匹配,树没法用。还有“为什么隐式转换失效”,字符串列传数字,MySQL把列转成数字,等于对列做了函数运算。这些场景背下来,面试稳一半。
问题五:索引下推是什么?MySQL 5.6之后有什么优化?
索引下推是MySQL 5.6引入的优化。没有它,联合索引(a,b)查a=1 and b like '%x',存储引擎先按a=1捞出所有记录,回表,再在Server层过滤b。有了索引下推,存储引擎直接在索引层过滤b,减少回表次数。面试官问这个,是在看你有没有跟进MySQL新特性。类似的还有MRR、覆盖索引、自适应哈希。能说出索引下推的原理和收益,说明你不只是背八股,是真读过文档。
这5个问题答得漂亮,面试官会认定你懂数据库。答得含糊,他会担心你上线后写出一条拖垮生产的SQL。索引知识不是面试专用,是你每天写代码的护身符。把B+树画一遍,把回表跑一遍,把最左前缀在脑子里推一遍,比背一百道题管用。