
1) 【一句话结论】:采用时间分片结合用户ID分库的分库分表策略,并设计复合索引(如用户ID+时间戳)和覆盖索引,确保按用户ID查询最近行为和按时间范围查询的高性能。
2) 【原理/概念讲解】:分库分表是为了解决单库数据量过大导致的性能瓶颈。垂直分库是将不同业务表拆分到不同库(如用户表、行为表拆到不同库),水平分片是将同一表按数据量拆分到多个库/表(如按用户ID取模)。时间分片是按时间维度(如按天、月)拆分表(如每天一个表)。索引优化中,B+树索引能高效支持范围查询,复合索引(多个字段组合)能提升多条件查询性能,覆盖索引(索引包含查询所需所有字段)可减少回表。
类比:分库分表像把一个大图书馆的书按主题(垂直分库)或按作者(水平分片)分成多个小图书馆,时间分片像按年份分房间,索引像书的目录,能快速找到特定书籍。
3) 【对比与适用场景】:
| 方式 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 垂直分库 | 按业务拆分表(如用户表、行为表拆到不同库) | 每库数据量小,事务集中 | 业务复杂,表间关联多 | 需跨库事务(如分布式事务) |
| 水平分片 | 按数据量拆分表(如按用户ID取模) | 单表数据量仍大 | 数据量巨大,单表查询 | 需分片键,跨分片查询复杂 |
| 时间分片 | 按时间维度拆分表(如按天、月) | 数据按时间有序,查询按时间范围 | 日志类、时间序列数据 | 需处理数据迁移,避免数据冗余 |
4) 【示例】:
表结构设计:
CREATE TABLE user_action (
user_id BIGINT NOT NULL,
action_type VARCHAR(20),
action_time TIMESTAMP NOT NULL,
action_data JSON,
PRIMARY KEY (user_id, action_time) -- 主键,按用户ID和时间有序
) ENGINE=InnoDB;
分库分表策略:
CREATE INDEX idx_user_time ON user_action (user_id, action_time);(支持按用户ID查询最近行为,ORDER BY action_time DESC LIMIT 1)。CREATE INDEX idx_time_data ON user_action (action_time, action_data);(若查询只需要action_time和action_data,减少回表)。5) 【面试口播版答案】:(约80秒)
“面试官您好,针对日写入数亿条日志表,我会从分库分表和索引优化两方面设计。首先分库分表,采用时间分片结合用户ID分库的策略:按用户ID取模分库(如8个库),按行为时间按天分表(如每天一个表),这样既分散了单库压力,又利用时间有序性提升查询效率。然后索引优化,针对按用户ID查询最近行为,创建复合索引(user_id + action_time),支持范围查询;针对按时间范围查询,创建覆盖索引(action_time + action_data),减少回表。这样既能应对海量写入,又能高效支持用户行为查询。”
6) 【追问清单】:
7) 【常见坑/雷区】: