
用户表设计需结合读写分离(主库写、从库读)与分库分表(哈希分库+时间分表),主键用雪花算法保证唯一有序,通过索引优化高频查询,确保高并发下读性能提升、写性能通过分库扩展,系统可水平扩展,同时通过分布式事务与缓存减少数据库压力。
| 方案 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 读写分离 | 主库写,从库读 | 读操作分散,写集中 | 读多写少(如用户表,读远多于写) | 需数据同步,避免主从延迟导致不一致 |
| 哈希分库 | 按用户ID哈希,分配到不同库 | 水平扩展,负载均衡 | 用户量极大(如快手数亿用户),单库无法承载 | 需全局ID生成器(如雪花算法),避免热点库 |
| 时间分表 | 按时间(如月)分表 | 数据按时间有序,便于归档 | 数据有生命周期(如用户注册记录、行为日志) | 需定期清理旧表,查询时需按时间范围过滤 |
CREATE TABLE user (
id BIGINT NOT NULL COMMENT '雪花算法生成,唯一有序',
username VARCHAR(50) NOT NULL COMMENT '用户名,唯一',
password VARCHAR(100) NOT NULL COMMENT '密码,加密存储',
email VARCHAR(100) UNIQUE COMMENT '邮箱,唯一',
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
status TINYINT DEFAULT 1 COMMENT '状态:1-正常,0-禁用',
PRIMARY KEY (id),
INDEX idx_username (username),
INDEX idx_email (email),
INDEX idx_status (status) -- 覆盖索引,提升status查询性能
);
id % 8)分配到对应库(如库0~7)。user_202401(2024年1月),每月新增一张表,旧表归档(如2023年12月及以前数据)。# 分库
db_index = user_id % db_count # db_count=8
# 分表
table_index = year(create_time) * 12 + month(create_time) # 2024年1月为13
table_name = f"user_{year}_{month}"
# 查询时路由
SELECT * FROM user_{year}_{month} WHERE id = ?;
username和email的联合索引:用于按用户名或邮箱查询用户(高频操作,如登录、找回密码)。status的覆盖索引:用于查询用户状态(如筛选正常用户),避免回表。用户表设计上,首先考虑读写分离,主库写,从库读,提升读性能。主键用雪花算法生成(时间+机器ID+序列号),保证唯一有序。然后分库分表:分库按用户ID哈希(比如8库,id % 8),分表按时间(按月),表名user_202401。索引方面,对username、email做联合索引,status做覆盖索引,提升查询性能。这样读操作分散到多个从库,写操作集中在一个库,同时数据按时间拆分,避免单表过大。性能上,读吞吐量提升(比如从单库的1万QPS提升到8库的8万QPS),写性能通过分库扩展(比如单库写压力从1000TPS提升到8库的8000TPS),扩展性方面,用户量增长时,增加库或表即可,不影响现有系统(比如用户量从1亿到10亿,只需加更多库或表,无需重构)。