拼多多 服务器研发-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 = "";

都可能“使用到”索引,但使用深度不同(最左前缀原则):

  1. a=?:用到 a;
  2. a=? and b=?:用到 a,b;
  3. a=? and c=?:通常只能稳定用到 a(c不能跨过b直接形成连续前缀);
  4. 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++工程能力.

全部评论

相关推荐

评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务