腾讯 AI 应用开发日常实习二面:并发模型与索引设计

岗位:AI 应用开发(日常实习) · 2 道题 · 更新于 2026-10-29

本场面试题

  1. 进程与线程有什么区别,怎样按任务选择?
  2. 创建 SQL 表时,应该怎样设计索引?

面经与参考答法

腾讯 AI 应用开发日常实习二面:并发模型与索引设计

腾讯AI应用开发日常实习二面记录,部门和面试年月未注明。以下选录进程线程与SQL索引两组;原文提到的两个并发选型例子未保留,不复原其题面。

以下短答、详解和示例均为编辑教学补充,不代表候选人现场回答、实际项目实现或企业标准答案。

(1)进程与线程有什么区别,怎样按任务选择?

以常见 Linux/POSIX 线程为例,进程提供独立地址空间,进程内线程共享堆与全局数据,但各有栈和执行状态。需要故障隔离时可选进程,需要频繁共享数据时可评估线程;能否利用多核、通信成本和同步成本,还取决于语言运行时及任务的 CPU/IO 特征。

详解

区别不能只背“进程重、线程轻”。同一进程里的线程能直接访问共享对象,传递大块数据较方便,但并发修改要用锁、原子操作或明确所有者。不同进程通常用管道、套接字或显式共享内存通信;共享内存仍要同步,不是天然安全。POSIX 线程手册列出了共享的全局内存、文件描述符及各线程独有状态。

用两个编辑设定的场景比较:解码不可信文件的工作单元可以放进独立进程,缩小内存破坏的影响;一个原生并行计算程序的多个任务反复读取同一份大数组,则可比较线程共享与进程间传输的实际成本。这些都不是原文未保留的两个现场例子。

隔离程度仍取决于部署:进程共享磁盘、数据库或外部队列时,一个进程出错仍可能破坏公共数据。线程也不是“通信零成本”,缓存一致性、内存竞争和同步都会消耗资源。对同一个内核线程上的多个协程,某一时刻只有一个执行;运行时若把协程调度到多个内核线程,则可以并行。语言全局锁、原生扩展和运行时版本都须单独核对,不凭“线程/协程”名称直接推断多核表现。

(2)创建 SQL 表时,应该怎样设计索引?

索引应由实际的过滤条件、连接、排序和返回列共同决定,再用真实参数和执行计划验证。可先把常见等值条件组织成联合索引前缀,再考虑范围、排序与覆盖;每个索引同时增加空间和写维护成本,不能简单给每一列都建索引。

详解

下面以 MySQL 8.4/InnoDB 为教学假设,原文没有给出数据库产品或表结构。设文档列表查询为:

SELECT id, updated_at
FROM documents
WHERE owner_id = ? AND status = ?
ORDER BY updated_at DESC, id DESC
LIMIT ?;

可以比较 (owner_id, status, updated_at, id) 等候选组合:前两列等值限定一个子范围,后两列提供有确定并列顺序的时间排序;查询只需索引中已有的字段时,具备覆盖的条件。联合索引按组合键顺序组织,因此只按 status 查询时,不能照搬同一条前缀定位路径。MySQL 联合索引说明解释了这种顺序关系。

这仍只是候选,数据分布会改变选择。若某个 owner 占了大部分数据,或绝大多数记录都是同一 status,实际扫描量可能很大;若常常读取正文等大字段,回表成本也不同。索引变宽还会占用更多页,并提高插入、更新和删除的维护开销。InnoDB 二级索引会携带主键,因此主键过宽也影响多个二级索引。

验证时用代表性参数观察实际选中的键、扫描量和排序方式,比较读收益与写代价;小表或低选择性查询可能采用扫描。“语法上可用索引”“优化器选了它”和“真的更快”应分别证明。此示例没有在数据库运行,不提供虚构的查询耗时。

面经是候选人自述,解析为 Agent Journey 整理。更多大厂 AI / Agent 岗面经 · 按目标公司模拟面试