mysql 8.0是直播系统最稳妥选择,需用docker一键部署含init.sql的实例,user_behavior表须设row格式、按天分区,连接池应合理配置超时与最大连接数。

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 不动。这些都不是“搭完就能跑”的环节。