拿下技术面上传简历

一张 2000 万行的订单表 orders(id PK, user_id, status, created_at, amount),status 只有 5 个取值,其中 'pending' 约占 3%。已有索引 PRIMARY(id)、(user_id, status)、(created_at)。现在有这样一条查询:SELECT * FROM orders WHERE status='pending' ORDER BY created_at DESC LIMIT 20。它在生产上要跑 3 秒左右,DBA 说它在全表扫描。请你判断为什么会走全表扫描,并给出你的索引方案,说明为什么是它。

工程与系统设计数据与存储3-5 年知识点 1 个

面试官在考什么

判断候选人能否把「选择性、最左匹配、索引有序性、回表成本」串成一条推理链,而不是背索引口诀。

SQL 与索引

回答框架 · 前两步

  1. 诊断结论:status 选择性极低(3% × 2000 万 = 60 万行),且已有索引都不含 status,优化器估算走索引过滤后回表的代价高于直接全表扫,所以选择扫全表。
  2. 加 (status, created_at) 联合索引:最左列等值过滤 status,第二列保证 created_at 在索引内有序,这样过滤和 ORDER BY ... LIMIT 20 都能在索引上完成,只回表 20 次。

还有 3 条答案要点、 3 层追问、 5 个常见坑, 以及针对你简历的追问路径,在定制报告里。

上传简历,生成我的题库先看示例报告

同一能力域的其他题