
1) 【一句话结论】:在高并发场景下优化MySQL,需通过索引优化(考虑维护成本与查询效率)、读写分离(主从复制分担读压力)、分库分表(水平/垂直分库分表解决数据量),结合事务隔离级别(如读已提交)与锁机制(行锁代替表锁),平衡性能与一致性,支撑360用户行为日志、病毒特征库等高并发存储需求。
2) 【原理/概念讲解】:
user_id+log_time),覆盖索引是索引包含查询所需所有字段(减少回表)。更新操作时,复合索引需更新多个索引项,增加I/O开销;覆盖索引减少回表但需确保索引列顺序匹配查询条件。3) 【对比与适用场景】:
索引类型对比:
| 索引类型 | 定义 | 特性 | 使用场景 | 注意点 |
|----------|------|------|----------|--------|
| B树索引 | 树形结构,支持范围查询 | 顺序访问,查询效率高 | 主键、外键、常用查询字段 | 占用空间大,更新慢 |
| 哈希索引 | 哈希表结构,支持等值查询 | 查询速度快,不支持范围 | 主键、唯一键(等值查询) | 不支持范围查询 |
| 覆盖索引 | 索引包含查询所需所有字段 | 减少回表,提升性能 | 查询字段在索引中 | 需确保索引列顺序正确 |
读写分离对比:
| 方式 | 定义 | 优点 | 缺点 | 适用场景 |
|------|------|------|------|--------|
| 主从复制 | 主写从读,从库异步复制 | 分担读压力,提升读性能 | 从库数据延迟,主库故障时从库不可用 | 读多写少场景(如日志、缓存) |
| 主主复制 | 多主库,互为从库 | 提升写性能,高可用 | 需解决写冲突(如事务提交顺序) | 写多读少,需事务一致性 |
分库分表策略对比:
| 策略 | 定义 | 优点 | 缺点 | 适用场景 |
|------|------|------|------|--------|
| 水平分库 | 按业务或数据范围分库(如用户表按ID哈希分库) | 单库数据量小,查询快 | 跨库关联查询复杂 | 大数据量,业务拆分 |
| 水平分表 | 按时间或ID分表(如日志按月分表) | 单表数据量小,查询快 | 需要分表键,关联查询复杂 | 时间序列数据(如日志、监控) |
| 垂直分库 | 按表分库(如用户表、行为表分库) | 减少单库表数,提升性能 | 跨库事务复杂 | 表结构复杂,表数多 |
结论总结:360场景下,用户行为日志读多写少,用主从复制+复合索引+覆盖索引;病毒特征库大数据量,用水平分库(按特征类型),水平分表(按时间)结合,事务用读已提交,行锁减少锁冲突。
4) 【示例】:
CREATE TABLE user_action_log (
log_id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
action_type VARCHAR(20) NOT NULL,
log_time TIMESTAMP NOT NULL,
log_data JSON,
INDEX idx_user_id_log_time (user_id, log_time), -- 复合索引,最左前缀
INDEX idx_log_time_user_id (log_time, user_id) -- 另一种顺序,查询时需注意
);
-- 覆盖索引示例:查询某用户某时间段行为,索引包含user_id, log_time, action_type
SELECT user_id, action_type, log_time FROM user_action_log WHERE user_id = 1 AND log_time BETWEEN '2024-01-01' AND '2024-01-31';
-- 索引包含所有查询字段,无需回表,提升性能
-- 假设按特征类型哈希分库,类型1-3的库为库1,4-6的库为库2
CREATE TABLE virus_feature_1 (
feature_id BIGINT PRIMARY KEY,
feature_type INT NOT NULL,
feature_data BLOB,
INDEX idx_feature_type (feature_type)
);
CREATE TABLE virus_feature_2 (
feature_id BIGINT PRIMARY KEY,
feature_type INT NOT NULL,
feature_data BLOB,
INDEX idx_feature_type (feature_type)
);
-- 热点问题:若特征类型1(如常见病毒)数据量极大,所有请求都打到库1,导致热点。解决:一致性哈希或轮询,或按特征ID分片(如特征ID哈希到多个库)
-- 预聚合表:按月聚合日志,存储月内行为统计
CREATE TABLE user_action_month_agg (
user_id BIGINT,
month DATE,
action_count INT,
feature_match_count INT,
INDEX idx_user_month (user_id, month)
);
-- 预聚合后查询:减少实时JOIN压力
SELECT u.user_id, u.action_count, f.feature_match_count
FROM user_action_month_agg u
JOIN virus_feature_type1 f ON u.user_id = f.user_id AND u.month = f.month;
5) 【面试口播版答案】:
“在高并发场景下优化MySQL,核心是通过索引优化、读写分离、分库分表提升性能,同时处理事务与锁。比如360的用户行为日志,读多写少,我们建了user_id和log_time的复合索引,还用了覆盖索引,减少回表。读写分离用主从复制,主库写日志,从库处理查询,分担读压力。分库方面,病毒特征库按特征类型分库,避免单库数据量过大。事务方面,选择读已提交隔离级别,减少锁等待,用行锁代替表锁。分库分表后,跨库关联查询用预聚合表,减少实时JOIN压力。这样能平衡性能与一致性,支撑高并发需求。”(约100秒)
6) 【追问清单】:
user_id+时间范围加锁),减少并发阻塞。7) 【常见坑/雷区】:
log_time+user_id建索引,但查询时按user_id+log_time,导致索引失效。