2.8 KiB
2.8 KiB
conversion overview mysql8 compatibility
Goal
修复 adminapi/stats.conversion/overview 在数据库切换到 MySQL 8.0 后的 SQL 不兼容问题,并在不引入缓存的前提下优化该方法中的慢查询,保证 dimension=dept 与 include_filters=1 场景可正常且更快地查询。
What I already know
- 主逻辑在
server/app/adminapi/logic/stats/ConversionLogic.php - 运行日志里已有一条 MySQL 语法错误记录:
SQLSTATE[42000]: Syntax error or access violation: 1064 ... near '( q.follow_admin_ids, '$[*]' COLUMNS (...)' - 当前
ConversionLogic.php已不再包含JSON_TABLE,说明兼容修复可能做过一半,仍需核对当前文件中的 MySQL 8 风险点 - 当前文件仍有多处
fieldRaw + group聚合查询,MySQL 8 默认ONLY_FULL_GROUP_BY更严格,需要重点检查 - 当前文件使用了表名
order、whereRaw、多处左连接与聚合,均可能触发 MySQL 8 兼容性问题 - 历史运行日志显示慢点主要集中在:
hydrateFanStats,多次达到0.7s ~ 2.4sinclude_filters=1时的buildFilterOptions -> DiagnosisLogic::getAssistants,曾到18s+
Assumptions (temporary)
- 当前用户提到的“不兼容”针对的是
stats.conversion/overview当前版本,不要求顺带修复其他统计模块 - 优先修复服务端 SQL 兼容性,并优化 SQL 结构,不改接口出参结构
- 若发现旧版遗留的 JSON_TABLE 逻辑已被替换,则以当前代码中的聚合、NULL 比较、保留字、原生 SQL 片段为修复重点
Open Questions
- 无。已有日志和代码足够开始修复。
Requirements
- 审查并修复
ConversionLogic.php中 MySQL 8.0 不兼容 SQL - 保证
overview?page_no=1&page_size=15&dimension=dept&media_channel_code=&time_type=today&include_filters=1可执行 - 优化该接口中的主要慢 SQL,重点关注
hydrateFanStats和include_filters=1时的筛选项查询 - 避免引入新的统计口径变化
- 尽量将原生 SQL 改为更稳定的 Builder 写法,或改成 MySQL 8 兼容表达式
Acceptance Criteria
ConversionLogic中不再包含已知 MySQL 8 不兼容写法- 关键聚合查询在 MySQL 8 的
ONLY_FULL_GROUP_BY下可通过 - 至少一个已知慢点的 SQL 结构得到收敛优化
- 不改变现有接口结构和主要业务语义
- 至少完成 PHP 语法检查
Out of Scope
- 其他统计模块(如
YejiStatsLogic、DoctorDailyStatsLogic)的整体兼容性修复 - 前端页面样式或交互修改
Technical Notes
- 目标文件:
server/app/adminapi/logic/stats/ConversionLogic.php - 参考日志:
server/runtime/adminapi/log/202604/22.log
Research References
research/current-findings.md— 当前代码与历史报错线索