AI-Agent 高频面试题汇总 - MySQL基础篇
1. MySQL 常见存储引擎有哪些?有什么区别?
常见是 InnoDB 和 MyISAM。
- InnoDB:支持事务、行锁、外键,适合高并发 OLTP(线上业务)
- MyISAM:不支持事务和行锁,读多写少场景才会考虑AI-Agent 在线系统一般优先 InnoDB。
2. 什么是事务?事务四大特性(ACID)是什么?
事务是“一组操作要么都成功要么都失败”。ACID:
- A 原子性
- C 一致性
- I 隔离性
- D 持久性
3. MySQL 事务隔离级别有哪些?
四级:
- Read Uncommitted
- Read Committed
- Repeatable Read(MySQL 默认)
- Serializable隔离级别越高,并发性能通常越低。
4. 脏读、不可重复读、幻读分别是什么?
- 脏读:读到别人未提交数据
- 不可重复读:同一行前后两次读值不同
- 幻读:同条件两次查询,行数不同(出现“新行”)
5. 如何开启、提交、回滚事务?
START TRANSACTION; -- SQL... COMMIT; -- 或 ROLLBACK;
6. 什么是索引?为什么能加速查询?
索引是高效数据结构(常见 B+Tree),减少全表扫描,降低 IO 次数,从而加速查询。
7. 索引有哪些常见类型?
- 主键索引(PRIMARY)
- 唯一索引(UNIQUE)
- 普通索引(INDEX)
- 联合索引(多列)
- 前缀索引(字符串前缀)
- 全文索引(FULLTEXT,特定场景)
8. 什么时候索引会失效?
常见失效场景:
- 对索引列做函数/计算
- 隐式类型转换
- 联合索引不满足最左前缀
like '%xx'前导模糊or条件一侧无索引
9. 什么是最左前缀原则?
联合索引 (a,b,c) 能命中 a、a,b、a,b,c,一般不能直接命中 b,c。
10. 如何查看 SQL 是否走索引?
EXPLAIN SELECT * FROM t_user WHERE **********';
重点看 type、key、rows、Extra。
11. EXPLAIN 中常见字段怎么看?
type:访问类型(const/ref/range/all)key:实际使用的索引rows:预估扫描行数(越小越好)Extra:如Using filesort、Using temporary需关注
12. 什么是覆盖索引?
查询字段全部可在索引中拿到,不用回表。性能通常更好。(Extra 常见 Using index)
13. 什么是回表?
二级索引命中后,再回主键索引取完整行数据。回表多会增加 IO。
14. 如何创建/删除索引?
CREATE INDEX idx_user_email ON t_user(email); CREATE UNIQUE INDEX uk_order_no ON t_order(order_no); DROP INDEX idx_user_email ON t_user;
15. 什么是慢查询?如何排查?
执行时间长、扫描行多的 SQL。排查:慢日志 + EXPLAIN + 索引优化 + SQL 改写。
16. 如何开启慢查询日志?
SHOW VARIABLES LIKE 'slow_query_log'; SHOW VARIABLES LIKE 'long_query_time';
(生产通常在配置文件里持久化开启)
17. count(*)、count(1)、count(列) 区别?
count(*):统计行数(推荐)count(1):本质接近count(列):不统计该列为 NULL 的行
18. where 和 having 的区别?
where:分组前过滤having:分组后过滤(常配合聚合函数)
19. inner join / left join 区别?
inner join:取两边匹配行left join:保留左表全部,不匹配右表补 NULL
20. join 过慢怎么优化?
常见手段:
- 给连接字段加索引
- 小表驱动大表
- 只查必要列(避免
select *) - 拆分复杂 SQL,减少临时表/排序
21. 什么是主从复制?AI-Agent 为什么常用?
主库写,从库读,提升读能力与可用性。AI-Agent 场景(会话查询、日志检索)读多写少时非常常见。
22. 什么是读写分离?
写请求走主库,读请求走从库,缓解主库压力。
23. 主从延迟会导致什么问题?
读到旧数据(写后立刻读不一致)。常见处理:关键读回主库、延迟容忍、重试机制。
24. 什么是分库分表?什么时候做?
单库单表数据量过大、QPS过高时做水平拆分。代价是事务、跨库 join、运维复杂度上升。
25. 如何设计 AI-Agent 的会话表?
核心字段建议:
session_iduser_idrole(user/assistant/tool)contenttoken_countcreated_at并对session_id + created_at建联合索引,优化历史消息读取。
26. 如何避免重复写入(幂等)?
用唯一键约束幂等ID(如 request_id),配合 UPSERT。
ALTER TABLE t_msg ADD UNIQUE KEY uk_req (request_id);
INSERT INTO t_msg(request_id, content)
VALUES('req_001','hello')
ON DUPLICATE KEY UPDATE content=VALUES(content);
27. delete、truncate、drop 区别?
delete:删数据,可带 where,可回滚(事务中)truncate:清空表,DDL,速度快drop:删表结构+数据
28. varchar 和 char 区别?
char:定长,适合长度固定字段varchar:变长,节省空间,业务里更常用
29. datetime 和 timestamp 区别?
datetime:范围大,和时区处理相对独立timestamp:存储空间小,受时区影响明显,常用于更新时间戳
30. 什么是外键?线上为什么常不强依赖外键?
外键保证引用完整性,但高并发下会增加约束开销、影响扩展。很多互联网系统在应用层保证一致性。
31. 什么是死锁?如何处理?
多个事务互相等待对方锁资源。处理:
- 缩短事务
- 固定加锁顺序
- 命中索引减少锁范围
- 捕获死锁错误后重试
32. 行锁和表锁区别?
- 行锁:锁粒度小,并发高(InnoDB)
- 表锁:锁整表,并发低但开销小(某些场景)
33. 什么情况下会出现间隙锁?
InnoDB 在 RR 隔离级别下,为防幻读,对索引区间加锁(范围查询常见)。
34. 如何查看当前连接与执行线程?
SHOW PROCESSLIST;
35. 如何查看表结构和建表语句?
DESC t_user; SHOW CREATE TABLE t_user;
36. 如何新增字段、修改字段、加索引?
ALTER TABLE t_user ADD COLUMN last_login DATETIME; ALTER TABLE t_user MODIFY COLUMN nickname VARCHAR(64); ALTER TABLE t_user ADD INDEX idx_last_login(last_login);
37. 如何做分页?深分页为什么慢?
基础分页:
SELECT id,content FROM t_msg ORDER BY id DESC LIMIT 0,20;
深分页慢是因为 offset 越大扫描越多。优化:基于上次最大/最小 id 游标翻页(seek 方法)。
38. 如何避免 SQL 注入?
核心:参数化查询(预编译),不要字符串拼接 SQL。并对输入做长度、格式、白名单校验。
39. AI-Agent 场景下,MySQL 与向量库如何分工?
- MySQL:结构化数据(用户、会话元数据、任务状态、审计日志)
- 向量库:语义检索(embedding 相似度召回)二者组合最常见:MySQL 管“业务真相”,向量库管“语义召回”。
40. 面试中如何讲一个 MySQL 优化案例?
现象(慢) → 定位(慢日志+EXPLAIN) → 根因(索引缺失/SQL不优) → 修复(加索引+改SQL) → 结果(耗时下降、QPS提升)。这个表达方式最容易拿分。
本专栏聚焦 AI-Agent 面试高频考点,内容来自真实面试与项目实践。系统覆盖大模型基础、Prompt工程、RAG、Agent架构、工具调用、多Agent协作、记忆机制、评测、安全与部署优化等核心模块。以“原理+场景+实战”为主线,提供高频题解析、标准答题思路与工程落地方法,帮助你高效查漏补缺.
