
1) 【一句话结论】
游戏用户系统数据库设计需结合全局ID(雪花算法)、分库分表(哈希分片+时间分区)、读写分离及索引优化,通过主键、索引、分片策略应对高并发,提升读写性能与数据一致性。
2) 【原理/概念讲解】
3) 【对比与适用场景】
| 对比项 | 读写分离 | 分库分表 |
|---|---|---|
| 定义 | 主库写+多从库读的复制架构 | 水平/垂直切分数据库,分散数据 |
| 特性 | 读高并发,写集中;延迟低(从库同步) | 扩展性(容量/性能),跨库事务复杂 |
| 使用场景 | 读多写少(如用户查询、日志) | 写多读多(如游戏用户、交易) |
| 注意点 | 从库延迟、数据一致性 | 分片键选择、跨库查询、事务一致性 |
4) 【示例】
CREATE TABLE user (
user_id BIGINT PRIMARY KEY, -- 雪花算法生成的全局ID
username VARCHAR(50) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE role (
role_id BIGINT PRIMARY KEY,
user_id BIGINT NOT NULL,
role_type ENUM('player', 'vip', 'admin') NOT NULL,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES user(user_id) ON DELETE CASCADE
);
user_id建主键(关联用户表),按user_id+role_type建复合索引(加速按用户查询角色)。CREATE TABLE level (
level_id BIGINT PRIMARY KEY,
user_id BIGINT NOT NULL,
level_num INT NOT NULL,
exp INT NOT NULL,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES user(user_id) ON DELETE CASCADE
);
user_id+level_num建复合索引(加速按用户和等级查询)。user_id哈希(如user_id % 8)分配到8个库(库1-8),每个库独立部署。create_time分区(如user_2023_01、user_2023_02),role表按create_time分区,level表按create_time分区。user_id哈希定位库,再根据分区规则定位表,合并结果集。5) 【面试口播版答案】
“面试官您好,针对游戏用户系统,我设计表结构时,核心是解决高并发下的读写与扩展问题。首先,用户表用雪花算法生成全局ID作为主键,避免自增ID分片倾斜。然后采用读写分离,主库写,从库读,通过路由服务分发请求,提升读性能。分库分表上,按用户ID哈希分库(比如8个库),按时间分区(月/年),解决单库瓶颈。索引优化方面,用户表主键建索引,角色表按用户ID+角色类型建复合索引,等级表按用户ID+等级数建索引,减少全表扫描。分片策略通过路由服务,根据用户ID哈希定位库和表,合并结果,提升查询性能。这样既能应对高并发,又能保证数据一致性和扩展性。”
6) 【追问清单】
7) 【常见坑/雷区】