拼多多 服务器研发-C++ 二面
1. 请做一个 1 分钟自我介绍
2. 有联合索引 index_abc(a,b,c),以下 SQL 是否用到索引?语句 3 与 4 性能有何差异?
select * from user where a = ""; select * from user where a = "" and b = ""; select * from user where a = "" and c = ""; select * from user where a = "" and d = "";
都可能“使用到”索引,但使用深度不同(最左前缀原则):
- a=?:用到 a;
- a=? and b=?:用到 a,b;
- a=? and c=?:通常只能稳定用到 a(c不能跨过b直接形成连续前缀);
- a=? and d=?:d不在索引里,通常用到 a 后回表再过滤 d。
语句 3 vs 4:
- 二者都可能先走 a;
- 若语句 3 满足覆盖索引或 ICP(索引条件下推)等条件,可能比语句 4 更优;
- 实际以 EXPLAIN 为准,核心看 rows/filtered/Extra。
3. InnoDB 二级索引叶子节点到底存什么?为什么会“回表”?
InnoDB 主键索引(聚簇索引)叶子节点存整行记录; 二级索引叶子节点存:二级索引键 + 主键值。 所以查二级索引但要取非索引列时,需要拿主键再去聚簇索引查整行,这就是回表。
代码:
-- 仅查询二级索引覆盖列,可能避免回表 EXPLAIN SELECT a,b,c FROM user WHERE a='x' AND b='y'; -- 查询额外列,通常需要回表 EXPLAIN SELECT a,b,c,d FROM user WHERE a='x' AND b='y';
4.什么是覆盖索引与索引下推(ICP)?如何判断是否生效?
- 覆盖索引:查询列都在同一索引中,避免回表;
- ICP:把部分 where 条件在存储引擎层提前过滤,减少回表次数。
EXPLAIN 常见信号:
- 覆盖索引:Extra 出现 Using index;
- ICP:Extra 出现 Using index condition。 注意:select * 常常破坏覆盖索引收益。
5. 手撕:Tom 与 Jack 击球模拟(随机数 %13==0 失败),打印对局记录和结果
思路:循环轮转玩家,计数击球次数;每次随机生成 1~100,若 %13==0 当前玩家失败,对方获胜并结束。
代码(C++):
#include <iostream>
#include <string>
#include <random>
using namespace std;
int main() {
string p1 = "Tom", p2 = "Jack";
bool tomTurn = true;
int hitCount = 0;
random_device rd;
mt19937 gen(rd());
uniform_int_distribution<int> dist(1, 100);
while (true) {
string cur = tomTurn ? p1 : p2;
string opp = tomTurn ? p2 : p1;
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++ 常考面试题总结 文章被收录于专栏
本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.