Post

数据库与并发

B 树:键值分布整棵树(索引值+data 在每节点),搜索可能在非叶子结束(最好 O(1))。B+ 树:数据全在叶子节点,内部节点不存 data,叶子链指针相连。区别:① B+ 查询复杂度固定 O(log n) ② B+ 叶节点相连支持范围

后端与工程 阅读 0 点赞 0 评论 0

1. B 树 vs B+ 树

B 树:键值分布整棵树(索引值+data 在每节点),搜索可能在非叶子结束(最好 O(1))。B+ 树:数据全在叶子节点,内部节点不存 data,叶子链指针相连。区别:① B+ 查询复杂度固定 O(log n) ② B+ 叶节点相连支持范围查询 ③ B+ 内节点无 data 索引范围更大,更适合外部存储。

2. MVCC 与隔离级别

MVCC 为每事务创建数据快照,读写不互斥。四级:① READ UNCOMMITTED(不用 MVCC,脏读)② READ COMMITTED(每次读建新快照,解决脏读,可能不可重复读)③ REPEATABLE READ(MySQL 默认,事务开始建快照全程用同一个,解决不可重复读) ④ SERIALIZABLE(完全串行,性能最低)。

3. SQL 优化

① 用索引 ② 能聚合优先聚合 ③ 建临时表 ④ 做大宽表;ClickHouse 分区分桶。

4. ClickHouse

列式存储适合大数据量聚合分析。ReplacingMergeTree 按主键去重保留最新版本,适合增量更新(状态更新去重)语义。信托数仓每日增量同步用它做入库更新。

5. Elasticsearch 召回为什么快

倒排索引(每词映射到含它的文档列表)② 分片机制(并行查多分片,负载分散,副本容错)③ 缓存(相同查询直接返回)④ 压缩优化减 I/O。

6. 多线程与并发

  • 主线程:程序启动第一个线程,结束时等所有非守护线程。
  • 守护线程:后台服务线程,优先级低,主线程结束自动终止(GC/监控)。
  • 常见问题:① 竞态条件(多线程访问共享资源顺序不定)② 死锁(循环等待,四条件:互斥/请求保持/不可剥夺/循环等待)③ 活锁(不断改状态但不推进,解决:随机等待/优先级/超时重试)。

7. 经典 SQL 真题(网吧认识关系)

题:网吧记录(bar_id, user_id, login_time, logoff_time)。规则1:同网吧上线或下线时间间隔 ≤10 分钟则可能认识;规则2:3 家以上网吧出现规则1则一定认识。求一定认识的组合数。

WITH potential_acquaintances AS (
 SELECT a.user_id AS user1, b.user_id AS user2, a.bar_id
 FROM internet_bar_record a
 JOIN internet_bar_record b
 ON a.bar_id = b.bar_id
 AND a.user_id < b.user_id -- 避免重复和自匹配
 WHERE ABS(TIMESTAMPDIFF(SECOND, a.login_time, b.login_time)) <= 600
 OR ABS(TIMESTAMPDIFF(SECOND, a.logoff_time, b.logoff_time)) <= 600
),
acquaintance_counts AS (
 SELECT user1, user2, COUNT(DISTINCT bar_id) AS bar_count
 FROM potential_acquaintances
 GROUP BY user1, user2
)
SELECT COUNT(*) AS final_count
FROM acquaintance_counts
WHERE bar_count >= 3;

思路三步:① 同网吧自 JOIN 找所有用户对(user1 < user2 去重)② WHERE 应用规则1 ③ GROUP BY 统计 DISTINCT 网吧数 ≥3。


继续阅读

全部归档

评论