
1) 【一句话结论】用户查询延迟高(平均200ms),核心瓶颈是数据库查询效率低(占延迟60%),其次是服务端业务逻辑(20%)和网络延迟(20%)。优化需优先优化数据库索引,辅以缓存和异步处理,综合降低延迟。
2) 【原理/概念讲解】老师讲解:
EXPLAIN SELECT * FROM question WHERE content LIKE '%问题%';显示“Full Scan”),相当于在图书馆找书时逐本翻,导致I/O和CPU开销激增。可通过EXPLAIN分析查询计划,识别缺失索引字段(如问题内容字段),创建全文索引提升效率。3) 【对比与适用场景】
| 优化手段 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 数据库索引优化 | 为表字段创建索引(如B树、全文索引),加速查询 | 提升查询效率,减少全表扫描 | 查询条件频繁、数据量大的场景(如按问题内容、用户ID查询) | 增加写入成本(索引维护),需权衡读写比例;高写入场景建议覆盖索引或分片 |
| 缓存策略(Redis) | 将热点数据存入内存,快速响应 | 减少数据库访问,提升读取速度 | 高频查询、数据变化不频繁的场景(如常见问题库、用户常用问题) | 需处理缓存击穿(互斥锁)、雪崩(热点数据预热)、过期问题(TTL) |
| 服务拆分与异步处理 | 将耗时操作(如AI推理)异步化,通过消息队列(如Kafka)处理 | 降低服务响应时间,提升系统吞吐量 | 耗时业务逻辑(如复杂计算、模型推理),需解耦服务 | 服务间通信延迟(如消息队列延迟),选择gRPC(低延迟)或HTTP(高可用) |
4) 【示例】
EXPLAIN SELECT answer FROM question_answer WHERE question_id = ? AND content LIKE '%问题%';,若显示“Full Scan”,说明缺少全文索引。创建全文索引:CREATE INDEX idx_question_content ON question_answer(content);def get_answer(question_id, question_text):
key = f"answer:{question_id}"
answer = redis.get(key)
if answer:
return json.loads(answer)
answer = db.query("SELECT answer FROM question_answer WHERE question_id = ? AND content LIKE ?", (question_id, f"%{question_text}%"))
if answer:
redis.setex(key, 300, json.dumps(answer))
return answer
return "未找到答案"
5) 【面试口播版答案】
面试官您好,用户查询延迟高(平均200ms),核心原因是数据库查询效率低(占延迟60%),其次是服务端业务逻辑(20%)和网络延迟(20%)。优化需分三步:首先,数据库索引优化,为问题内容、用户ID等查询字段创建全文索引,减少全表扫描;其次,引入缓存策略,用Redis缓存热点问题答案,高频查询直接从缓存返回;最后,服务拆分与异步处理,将AI推理等耗时操作异步化,通过消息队列减少同步调用延迟。比如,对于常见问题,先查缓存,缓存未命中再查数据库并更新缓存,能显著降低数据库压力,减少延迟。综合来看,优先解决数据库查询瓶颈,配合缓存和异步处理,能有效优化整体响应时间。
6) 【追问清单】
7) 【常见坑/雷区】