MySQL 8.0 是直播系统当前最稳妥的选择,5.7 已停维,8.0 的原子 DDL 和性能监控对用户行为表高频写入更友好。
用 Docker 一键拉起带初始化脚本的 MySQL 实例
直播系统启动前必须预置
live_db库、用户行为表结构和权限账号,硬编码或手动建表极易遗漏。Docker 方式可确保环境一致且秒级复现: 准备
init.sql:包含
CREATE DATABASE IF NOT EXISTS live_db CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;及
user_behavior表(含
user_id、
room_id、
event_type、
ts字段,
ts建
INDEX) 运行命令:
docker run -d --name mysql-live -p 3306:3306 -e MYSQL_ROOT_PASSWORD=dev123 -v $(pwd)/init.sql:/docker-entrypoint-initdb.d/init.sql -v mysql-data:/var/lib/mysql -d mysql:8.0注意:挂载的
init.sql只在首次启动时执行;若容器已存在,需
docker rm -f mysql-live并清空
mysql-data卷再试
用户行为表必须设为 ROW 格式 + 合理分区
直播中用户点赞、进入、弹幕等事件每秒可达万级写入,Binlog 格式和表结构直接影响下游 Flink/Spark 实时消费稳定性:
确认 Binlog 格式:SELECT VARIABLE_VALUE FROM performance_schema.global_variables WHERE VARIABLE_NAME = 'binlog_format';—— 必须为
ROW,否则无法精确捕获单行变更
user_behavior表按天分区:
ALTER TABLE user_behavior PARTITION BY RANGE (TO_DAYS(ts)) (PARTITION p20240601 VALUES LESS THAN (TO_DAYS('2024-06-02')), ...);
避免用 UUID或雪花 ID 作主键:高并发插入易导致页分裂;推荐
BIGINT AUTO_INCREMENT+ 写入端异步生成业务唯一键存为普通字段
连接池配置不当会直接拖垮直播心跳检测
用户在线状态依赖后台服务每 5 秒执行一次
UPDATE user_status SET last_heartbeat = NOW() WHERE user_id = ?,连接池若超时或泄漏,会导致大量连接堆积: Spring Boot 项目中,
spring.datasource.hikari.connection-timeout建议设为
3000(3 秒),避免心跳超时引发误踢用户
spring.datasource.hikari.maximum-pool-size不宜超过 20:直播服务通常多实例部署,单实例连接数过高会挤占 MySQL 总连接数(默认
max_connections=151) 务必开启
spring.datasource.hikari.leak-detection-threshold=60000(60 秒),及时发现未 close 的
Connection或
PreparedStatement
分区策略和连接池参数这类细节,在压测时才暴露——比如 5000 并发下,
user_behavior表没分区会导致
INSERT延迟飙升至 800ms;而连接池泄漏 10 分钟后,MySQL 的
Threads_connected就会卡在 149 不动。这些都不是“搭完就能跑”的环节。
