拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Java面试:MySQL索引优化,这样答稳过

Java面试:MySQL索引优化,这样答稳过 Java面试中MySQL索引优化几乎是必问项。答得好直接证明你有实战经验答不好前面Java基础再扎实也容易被压价。很多人栽在这题不是因为不懂而是回答太散、太理论。下面这套答法帮你稳过。一、先搞懂面试官真正想听什么他不想听你背“B树、聚簇索引、非聚簇索引”的定义。他想知道你能否定位慢查询、设计合理索引、避免索引失效、权衡读写性能。一句话他要的是“有优化意识的Java开发”不是DBA。二、回答框架四步法第一步定位问题。别上来就说“加索引”。先说“我会先开慢查询日志用EXPLAIN看type、key、rows、Extra。如果type是ALL说明全表扫描key为NULL说明没走索引Extra出现Using filesort或Using temporary就要重点优化。”第二步分析失效场景。最左前缀、函数操作、隐式转换、OR连接非索引列、LIKE %xx、!、IS NULL都可能导致失效。比如WHERE DATE(create_time) 2024-01-01函数作用在索引列上索引直接废掉应改成范围查询。第三步设计原则。高频查询建联合索引区分度高的列放前面尽量用覆盖索引减少回表控制索引数量一般单表不超过5个更新频繁的列慎建索引。第四步实战案例。我做过订单表优化原查询SELECT FROM orders WHERE user_id? AND status? ORDER BY create_time DESC全表扫描。我建了联合索引(user_id, status, create_time)并把SELECT改成只取必要字段形成覆盖索引。结果EXPLAIN的type从ALL变成refrows从百万降到几十接口P99从800ms降到80ms。三、高频追问及标准答案问什么是最左前缀答联合索引(a,b,c)查询条件必须从a开始才能用索引。WHERE b?用不上WHERE a? AND c?只能用到a。问覆盖索引是什么答查询的列全部在索引中无需回表。Extra显示Using index。比如索引(user_id, status)查询SELECT user_id, status FROM orders WHERE user_id?就能覆盖。问索引下推呢答MySQL 5.6 的特性。没有下推时存储引擎根据索引找到记录后回表再由Server层过滤。有了下推能在存储引擎层直接过滤减少回表次数。问索引越多越好吗答不是。索引占空间降低写入速度增加优化器选择成本。一般单表控制在5个以内。四、避坑回答“加索引就快了”——错索引可能失效也可能选错。“所有查询都要走索引”——错小表全扫更快区分度低的列建索引没意义。“LIKE %xx也能走索引”——错只有LIKE xx%能走。“EXPLAIN只看type就行”——错还要看key、rows、Extra。五、结合Java项目说在MyBatis里避免SELECT用EXPLAIN验证每条慢SQL分页别用LIMIT 100000,10改成WHERE id ? LIMIT 10批量插入用rewriteBatchedStatementstrue。这些细节面试官一听就知道你真干过。六、结尾记住面试官要的不是你背出所有索引类型而是你能说清“为什么慢、怎么优化、效果如何”。把四步法讲顺带上一个真实案例和量化结果这题你就稳了。薪资谈判时这就是你的底气。
返回列表