MySQL 慢查询日报(线上 prod8591)2026-10-19
统计概览
| 项目 | 值 |
|---|
| 统计范围 | 2026-10-19 00:00:00 ~ 23:59:59(Asia/Shanghai) |
| 环境 | prod-8591 |
| 慢日志条数(ES mysql-slow_*) | 60,773 条(指纹聚合取样 20,894 条,覆盖率 34%,超过 2 万条上限截断) |
| Top10 单条最慢 | 5,903.75 s(user=databasus_backup,ZHDX_t8591_52) |
| 非备份模式最大累计 | 2.88h(2983 次 × 3.48 s) |
| 备份模式(user 含 backup/databasus_backup) | 668 条、累计 13.00h(单独标注,不触发深析) |
| 监控巡检类(jmysql/proxysql_monitor 或 information_schema) | 944 条、累计 29.9min(多为 # Schema: 空导致采集端 _grokparsefailure、无库名;单独标注,不触发深析) |
| 深析模式 explain 成功率 | 8/8(100%) |
| 数据来源 | ES mysql-slow_*(@timestamp)+ MCP 只读 MySQL(describe_schema/explain) |
| 生成时间 | 2026-10-20 10:26(Asia/Shanghai) |
Top10 明细(按单条耗时)
| # | 耗时(s) | 库.表 | 行数 sent/examined | user / server | 慢因分类 |
|---|
| 1 | 5,903.75 | a8591.t8_ware_item_desc | 23,512,850 / 23,512,850 | databasus_backup / ZHDX_t8591_52 | EXPLAIN 全表扫描/未用索引 |
| 2 | 3,781.46 | a8591.t8_mall_stat | 173,166,807 / 346,333,614 | bi / ZHDX_t8591_107 | EXPLAIN 全表扫描/未用索引、排序未走索引(filesort) |
| 3 | 3,084.03 | (未解析) | 101 / 32,017,822 | bi / ZHDX_t8591_107 | 扫描行数远大于返回行数(32,017,822/101) |
| 4 | 2,963.80 | a8591.t8_mall_stat | 173,223,494 / 346,446,988 | bi / ZHDX_t8591_107 | EXPLAIN 全表扫描/未用索引、排序未走索引(filesort) |
| 5 | 2,876.16 | a8591.t8_mall_stat | 173,106,716 / 346,213,432 | bi / ZHDX_t8591_107 | EXPLAIN 全表扫描/未用索引、排序未走索引(filesort) |
| 6 | 2,808.13 | t8_game.t8_embeddings_cache | 793,282 / 793,282 | databasus_backup / ZHDX_t8591_91 | 其他(需结合 SQL 与执行计划人工判断) |
| 7 | 2,648.83 | (未解析) | 1,250,409 / 11,283,664 | bi / ZHDX_t8591_107 | 其他(需结合 SQL 与执行计划人工判断) |
| 8 | 1,819.41 | t8_extends.t8_ware_mall_logging | 100,652,396 / 100,652,396 | databasus_backup / ZHDX_t8591_91 | 其他(需结合 SQL 与执行计划人工判断) |
| 9 | 1,624.15 | a8591.dealLeaveWordContent | 187,311,665 / 187,311,665 | databasus_backup / ZHDX_t8591_52 | EXPLAIN 全表扫描/未用索引 |
| 10 | 1,486.92 | hk8591.h8_antifraud_post_rule_record | 4,283,242 / 4,283,242 | databasus_backup / ZHDX_t8591_203 | EXPLAIN 全表扫描/未用索引 |
高频慢查询模式(指纹聚合,取样 20,894 条)
按条数 Top5
| # | 模式(指纹摘要) | 条数 | 平均(s) | 累计 | server | user |
|---|
| 1 | SELECT c.* FROM t8_user_id_card_number_list AS c WHERE c.img_type = ? AND c.status = ? AND c.image != ? AND (c.ocr_result = ? or c.ocr_result is null) ORDER BY c.id ASC,c.id LIMIT ?; | 2,983 | 3.48 | 2.88h | ZHDX_t8591_143,ZHDX_t8591_16,ZHDX_t8591_ | a8591 |
| 2 | select t1_design_img.id, t1_design_img.views, t1_design_img.collection, t1_design_img.favor_count, t1_design_img.comment_count, t1_design_img.pin_share_count + …(点击展开完整 SQL)select t1_design_img.id, t1_design_img.views, t1_design_img.collection, t1_design_img.favor_count, t1_design_img.comment_count, t1_design_img.pin_share_count + t1_design_img.fb_share_count + t1_design_img.line_share_count as share_count, t1_design_img.downs + t1_design_img.save_count + t1_design_img.screenshot_count as download_count from t1_design_img inner join t1_design_work on t1_design_img.w_id = t1_design_work.id where t1_design_work.check_status = ? and t1_design_work.is_show = ? and t1_design_work.is_hide = ? and t1_design_work.publish_time <= ? and t1_design_img.id > ? order by t1_design_img.id asc limit ?; | 2,720 | 1.39 | 1.05h | ZHDX_t8591_73 | a591 |
| 3 | SELECT id FROM ware_item WHERE id > ? AND status > ? AND (actionTime BETWEEN ? AND ? ) ORDER BY id ASC LIMIT ?; | 1,080 | 1.65 | 29.7min | ZHDX_t8591_61 | a8591 |
| 4 | SELECT g.id AS game_id, g.name, pg.id AS platform_game_id, pg.platform_app_id FROM t8_platform_games pg INNER JOIN t8_games g ON g.id = pg.game_id WHERE pg.plat …(点击展开完整 SQL)SELECT g.id AS game_id, g.name, pg.id AS platform_game_id, pg.platform_app_id FROM t8_platform_games pg INNER JOIN t8_games g ON g.id = pg.game_id WHERE pg.platform_id = ? AND pg.enable = ? AND pg.id > ? AND pg.platform_app_id IS NOT NULL AND pg.platform_app_id <> ? AND g.type = ? AND g.enable = ? AND NOT EXISTS ( SELECT ? FROM t8_platform_game_media pgm WHERE pgm.platform_game_id = pg.id AND pgm.scene_type = ? LIMIT ? ) ORDER BY pg.id ASC LIMIT ?; | 1,080 | 1.88 | 33.8min | ZHDX_t8591_136 | a8591 |
| 5 | select i.*, COALESCE(v.views_30d, ?) AS views_30d, COALESCE(vip.vip_level, ?) AS vip_level, COALESCE(uc.collections_30d, ?) AS collections_30d from t1_design_im …(点击展开完整 SQL)select i.*, COALESCE(v.views_30d, ?) AS views_30d, COALESCE(vip.vip_level, ?) AS vip_level, COALESCE(uc.collections_30d, ?) AS collections_30d from t1_design_img as i left join t1_design_work as w on w.id = i.w_id left join (select c.company_id, c.work_id, MAX(c.level_order) AS vip_level from t1_vip_benefit_calendar as c where c.date = ? and c.benefit_type = ? and c.region_id > ? group by c.company_id, c.work_id) as vip on vip.company_id = w.design_id and vip.work_id = i.w_id left join (select source_id, COALESCE(SUM(view_count), ?) AS views_30d from t1_visits where source_type = ? and date >= ? group by source_id) as v on v.source_id = i.id left join (select work_id, COUNT(*) AS collections_30d from t1_user_collect where type = ? and created_at >= ? group by work_id) as uc on uc.work_id = i.id where i.id > ? order by i.id asc limit ?; | 782 | 2.99 | 39.0min | ZHDX_t8591_73 | a591 |
按累计耗时 Top5
| # | 模式 | 条数 | 平均(s) | 累计 | server | user |
|---|
| 1 | SELECT c.* FROM t8_user_id_card_number_list AS c WHERE c.img_type = ? AND c.status = ? AND c.image != ? AND (c.ocr_result = ? or c.ocr_result is null) ORDER BY c.id ASC,c.id LIMIT ?; | 2,983 | 3.48 | 2.88h | ZHDX_t8591_143,ZHDX_t8591_16,ZHDX_t8591_ | a8591 |
| 2 | select wallet, sum(if(type = ?, amount, ?)) - sum(if(type = ?, amount, ?)) as balance from a8591.t8_money_trade_log where account = ? and created_at <= ? group by wallet; | 142 | 56.38 | 2.22h | ZHDX_t8591_61 | a8591 |
| 3 | SELECT /*!? SQL_NO_CACHE */ * FROM a8591.t8_ware_item_desc; 🗄备份 | 1 | 5903.75 | 1.64h | ZHDX_t8591_52 | databasus_backup |
| 4 | select t1_design_img.id, t1_design_img.views, t1_design_img.collection, t1_design_img.favor_count, t1_design_img.comment_count, t1_design_img.pin_share_count + …(点击展开完整 SQL)select t1_design_img.id, t1_design_img.views, t1_design_img.collection, t1_design_img.favor_count, t1_design_img.comment_count, t1_design_img.pin_share_count + t1_design_img.fb_share_count + t1_design_img.line_share_count as share_count, t1_design_img.downs + t1_design_img.save_count + t1_design_img.screenshot_count as download_count from t1_design_img inner join t1_design_work on t1_design_img.w_id = t1_design_work.id where t1_design_work.check_status = ? and t1_design_work.is_show = ? and t1_design_work.is_hide = ? and t1_design_work.publish_time <= ? and t1_design_img.id > ? order by t1_design_img.id asc limit ?; | 2,720 | 1.39 | 1.05h | ZHDX_t8591_73 | a591 |
| 5 | SELECT * FROM t8_mall_stat ORDER BY created_at DESC; | 1 | 2876.16 | 47.9min | ZHDX_t8591_107 | bi |
备份模式全天 668 条 / 13.00h,未触发深度分析(如条数环比异常翻倍再人工介入)。
触发深度分析的模式(条数>100 或 累计>30min,非备份,最多 8 个)
1. SELECT c.* FROM t8_user_id_card_number_list AS c WHERE c.img_type = ? AND c.status = ? AND c.image != ? AND (c.ocr_result = ? or c.ocr_result is null) ORDER BY —— 2,983 次 × 3.48s = 2.88h
SELECT c.* FROM t8_user_id_card_number_list AS c WHERE c.img_type = 2 AND c.status = 2 AND c.image != '' AND (c.ocr_result = '' or c.ocr_result is null) ORDER BY c.id ASC,`c`.`id` LIMIT 1;
- 库表:a8591.t8_user_id_card_number_list;实例 alias:
prod-8591/8591-a
- explain SQL:
SELECT c.* FROM `a8591`.`t8_user_id_card_number_list` AS c WHERE c.img_type = 2 AND c.status = 2 AND c.image != '' AND (c.ocr_result = '' or c.ocr_result is null) ORDER BY c.id ASC,`c`.`id` LIMIT 1;
- 执行计划(EXPLAIN 表节点,按 JOIN 顺序):
| # | 表 | 访问类型 | 使用索引 | 候选索引 | 预扫行数 | 过滤后 |
|---|
| 1 | c | ⚠️ 全索引扫描 | PRIMARY | — | 1 | 5.0% |
- 慢因:扫描行数远大于返回行数(827,320/0)、全索引扫描(c: key=PRIMARY, rows=1,缺更优过滤索引)
- 建议:补索引(按 WHERE 等值列在前、范围列收尾建复合索引); 用 EXPLAIN 验证 key 命中; 扩复合索引: 把其余 WHERE 等值列追加到现有索引尾部, 避免 10 万+ 行回表
- 可执行 DDL(建议先在低峰期 EXPLAIN 验证再执行):
ALTER TABLE `a8591`.`t8_user_id_card_number_list` ADD INDEX `idx_img_type_status_ocr_result` (`img_type`, `status`, `ocr_result`);
2. select wallet, sum(if(type = ?, amount, ?)) - sum(if(type = ?, amount, ?)) as balance from a8591.t8_money_trade_log where account = ? and created_at <= ? group —— 142 次 × 56.38s = 2.22h
select wallet, sum(if(type = 2, amount, 0)) - sum(if(type = 1, amount, 0)) as balance from `a8591`.`t8_money_trade_log` where `account` = 'A0100' and `created_at` <= '2026-10-19 00:03:19' group by `wallet`;
- 库表:a8591.t8_money_trade_log;实例 alias:
prod-8591/8591-a
- explain SQL:
select wallet, sum(if(type = 2, amount, 0)) - sum(if(type = 1, amount, 0)) as balance from `a8591`.`t8_money_trade_log` where `account` = 'A0100' and `created_at` <= '2026-10-19 00:03:19' group by `wallet`;
- 执行计划(EXPLAIN 表节点,按 JOIN 顺序):
| # | 表 | 访问类型 | 使用索引 | 候选索引 | 预扫行数 | 过滤后 |
|---|
| 1 | t8_money_trade_log | ref | idx_aw | idx_created_at,idx_aw | 29,267,252 | 50.0% |
- 慢因:扫描行数远大于返回行数(21,413,734/2)、索引范围扫描量过大(t8_money_trade_log: key=idx_aw, rows=29,267,252)
- 建议:补索引(按 WHERE 等值列在前、范围列收尾建复合索引); 用 EXPLAIN 验证 key 命中
- 可执行 DDL(建议先在低峰期 EXPLAIN 验证再执行):
ALTER TABLE `a8591`.`t8_money_trade_log` ADD INDEX `idx_account_created_at` (`account`, `created_at`);
- DDL 注:
t8_money_trade_log 与现有索引 idx_aw(account, wallet) 前缀重复(account), 新索引生效后可评估删除旧索引
3. select t1_design_img.id, t1_design_img.views, t1_design_img.collection, t1_design_img.favor_count, t1_design_img.comment_count, t1_design_img.pin_share_count + —— 2,720 次 × 1.39s = 1.05h
select `t1_design_img`.`id`, `t1_design_img`.`views`, `t1_design_img`.`collection`, `t1_design_img`.`favor_count`, `t1_design_img`.`comment_count`, t1_design_img.pin_share_count + t1_design_img.fb_share_count + t1_design_img.line_share_count as share_count, t1_design_img.downs + t1_design_img.save_count + t1_design_img.screenshot_count as download_count from `t1_design_img` inner join `t1_design_work` on `t1_design_img`.`w_id` = `t1_design_work`.`id` where `t1_design_work`.`check_status` = 1 and `t1_design_work`.`is_show` = 1 and `t1_design_work`.`is_hide` = 0 and `t1_design_work`.`publish_time` <= '2026-10-19 00:04:23' and `t1_design_img`.`id` > 17420 order by `t1_design_img`.`id` asc limit 100;
- 库表:t591.t1_design_img;实例 alias:
prod-8591/100
- explain SQL:
select `t1_design_img`.`id`, `t1_design_img`.`views`, `t1_design_img`.`collection`, `t1_design_img`.`favor_count`, `t1_design_img`.`comment_count`, t1_design_img.pin_share_count + t1_design_img.fb_share_count + t1_design_img.line_share_count as share_count, t1_design_img.downs + t1_design_img.save_count + t1_design_img.screenshot_count as download_count from `t591`.`t1_design_img` inner join `t591`.`t1_design_work` on `t1_design_img`.`w_id` = `t1_design_work`.`id` where `t1_design_work`.`check_status` = 1 and `t1_design_work`.`is_show` = 1 and `t1_design_work`.`is_hide` = 0 and `t1_design_work`.`publish_time` <= '2026-10-19 00:04:23' and `t1_design_img`.`id` > 17420 order by `t1_design_img`.`id` asc limit 100;
- 执行计划(EXPLAIN 表节点,按 JOIN 顺序):
| # | 表 | 访问类型 | 使用索引 | 候选索引 | 预扫行数 | 过滤后 |
|---|
| 1 | t1_design_work | ref | is_hide | PRIMARY,is_hide,is_show,check_status | 16,274 | 8.33% |
| 2 | t1_design_img | ref | w_id | PRIMARY,w_id | 26 | 50.0% |
- 计划标志:⚠️ filesort 排序、⚠️ 产生临时表
- 慢因:扫描行数远大于返回行数(596,901/100)、DISTINCT/GROUP BY 产生临时表(大范围去重/聚合)、排序未走索引(filesort)
- 建议:补索引(按 WHERE 等值列在前、范围列收尾建复合索引); 用 EXPLAIN 验证 key 命中; 缩小聚合/去重范围(补时间等过滤条件), 或预聚合到中间表/定时任务; 把 ORDER BY 列纳入复合索引, 或减小排序前扫描范围
- 可执行 DDL(建议先在低峰期 EXPLAIN 验证再执行):
ALTER TABLE `t591`.`t1_design_img` ADD INDEX `idx_w_id_id` (`w_id`, `id`);
ALTER TABLE `t591`.`t1_design_work` ADD INDEX `idx_check_stat_is_show_is_hide_publish_ti` (`check_status`, `is_show`, `is_hide`, `publish_time`);
- DDL 注:
t1_design_img 与现有索引 w_id(w_id) 前缀重复(w_id), 新索引生效后可评估删除旧索引
- DDL 注:
t1_design_work 与现有索引 check_status(check_status, is_hide, is_show, publish_time) 前缀重复(check_status), 新索引生效后可评估删除旧索引
4. SELECT * FROM t8_mall_stat ORDER BY created_at DESC; —— 1 次 × 2876.16s = 47.9min
SELECT *
FROM t8_mall_stat
ORDER BY created_at DESC;
- 库表:a8591.t8_mall_stat;实例 alias:
prod-8591/8591-a
- explain SQL:
SELECT *
FROM `a8591`.`t8_mall_stat`
ORDER BY created_at DESC;
- 执行计划(EXPLAIN 表节点,按 JOIN 顺序):
| # | 表 | 访问类型 | 使用索引 | 候选索引 | 预扫行数 | 过滤后 |
|---|
| 1 | t8_mall_stat | ❌ 全表扫描 | — | — | 21,654,891 | 100.0% |
- 计划标志:⚠️ filesort 排序
- 慢因:EXPLAIN 全表扫描/未用索引、排序未走索引(filesort)、大结果集传输 SELECT * (Bytes_sent=2,766,722,199)
- 建议:补索引(按 WHERE 等值列在前、范围列收尾建复合索引); 用 EXPLAIN 验证 key 命中; 把 ORDER BY 列纳入复合索引, 或减小排序前扫描范围; 改分页/按需列, 避免 SELECT * 整表捞取; 大导出走离线通道
- 可执行 DDL(建议先在低峰期 EXPLAIN 验证再执行):
ALTER TABLE `a8591`.`t8_mall_stat` ADD INDEX `idx_created_at` (`created_at`);
5. select i.*, COALESCE(v.views_30d, ?) AS views_30d, COALESCE(vip.vip_level, ?) AS vip_level, COALESCE(uc.collections_30d, ?) AS collections_30d from t1_design_im —— 782 次 × 2.99s = 39.0min
select i.*, COALESCE(v.views_30d, 0) AS views_30d, COALESCE(vip.vip_level, 0) AS vip_level, COALESCE(uc.collections_30d, 0) AS collections_30d from `t1_design_img` as `i` left join `t1_design_work` as `w` on `w`.`id` = `i`.`w_id` left join (select `c`.`company_id`, `c`.`work_id`, MAX(c.level_order) AS vip_level from `t1_vip_benefit_calendar` as `c` where `c`.`date` = '2026-10-19' and `c`.`benefit_type` = 'work_top' and `c`.`region_id` > 0 group by `c`.`company_id`, `c`.`work_id`) as `vip` on `vip`.`company_id` = `w`.`design_id` and `vip`.`work_id` = `i`.`w_id` left join (select `source_id`, COALESCE(SUM(view_count), 0) AS views_30d from `t1_visits` where `source_type` = 'img' and `date` >= '2026-09-19' group by `source_id`) as `v` on `v`.`source_id` = `i`.`id` left join (select `work_id`, COUNT(*) AS collections_30d from `t1_user_collect` where `type` = 'img' and `created_at` >= '2026-09-19 03:07:36' group by `work_id`) as `uc` on `uc`.`work_id` = `i`.`id` where `i`.`id` > 125450 order by `i`.`id` asc limit 1000;
- 库表:t591.t1_design_img;实例 alias:
prod-8591/100
- explain SQL:
select i.*, COALESCE(v.views_30d, 0) AS views_30d, COALESCE(vip.vip_level, 0) AS vip_level, COALESCE(uc.collections_30d, 0) AS collections_30d from `t591`.`t1_design_img` as `i` left join `t591`.`t1_design_work` as `w` on `w`.`id` = `i`.`w_id` left join (select `c`.`company_id`, `c`.`work_id`, MAX(c.level_order) AS vip_level from `t591`.`t1_vip_benefit_calendar` as `c` where `c`.`date` = '2026-10-19' and `c`.`benefit_type` = 'work_top' and `c`.`region_id` > 0 group by `c`.`company_id`, `c`.`work_id`) as `vip` on `vip`.`company_id` = `w`.`design_id` and `vip`.`work_id` = `i`.`w_id` left join (select `source_id`, COALESCE(SUM(view_count), 0) AS views_30d from `t591`.`t1_visits` where `source_type` = 'img' and `date` >= '2026-09-19' group by `source_id`) as `v` on `v`.`source_id` = `i`.`id` left join (select `work_id`, COUNT(*) AS collections_30d from `t591`.`t1_user_collect` where `type` = 'img' and `created_at` >= '2026-09-19 03:07:36' group by `work_id`) as `uc` on `uc`.`work_id` = `i`.`id` where `i`.`id` > 125450 order by `i`.`id` asc limit 1000;
- 执行计划(EXPLAIN 表节点,按 JOIN 顺序):
| # | 表 | 访问类型 | 使用索引 | 候选索引 | 预扫行数 | 过滤后 |
|---|
| 1 | i | range | PRIMARY | PRIMARY | 404,059 | 100.0% |
| 2 | w | eq_ref | PRIMARY | PRIMARY | 1 | 100.0% |
| 3 | vip | ref | <auto_key0> | <auto_key0> | 3 | 100.0% |
| 4 | v | ref | <auto_key0> | <auto_key0> | 10 | 100.0% |
| 5 | uc | ref | <auto_key0> | <auto_key0> | 10 | 100.0% |
- 慢因:其他(需结合 SQL 与执行计划人工判断)
- 建议:结合 SQL 文本与执行计划人工复核; 考虑降频/缓存
- 可执行 DDL(建议先在低峰期 EXPLAIN 验证再执行):
ALTER TABLE `t591`.`t1_vip_benefit_calendar` ADD INDEX `idx_benefit_ty_region_id` (`benefit_type`, `region_id`);
- DDL 注:
t1_vip_benefit_calendar 与现有索引 idx_benefit_date(benefit_type, date) 前缀重复(benefit_type), 新索引生效后可评估删除旧索引
6. SELECT GROUP_CONCAT(mall_id) AS del_mall_ids FROM (SELECT mall_id FROM t8_ware_mall_logging WHERE action_time BETWEEN ? AND ? AND action_type = ? LIMIT ?) a; —— 292 次 × 7.61s = 37.1min
SELECT GROUP_CONCAT(mall_id) AS del_mall_ids FROM (SELECT mall_id FROM t8_ware_mall_logging WHERE action_time BETWEEN '2026-09-21 04:30:02' AND '2026-10-05 04:30:02' AND action_type = 'del' LIMIT 100) a;
- 库表:t8_extends.t8_ware_mall_logging;实例 alias:
prod-8591/8591-b
- explain SQL:
SELECT GROUP_CONCAT(mall_id) AS del_mall_ids FROM (SELECT mall_id FROM `t8_extends`.`t8_ware_mall_logging` WHERE action_time BETWEEN '2026-09-21 04:30:02' AND '2026-10-05 04:30:02' AND action_type = 'del' LIMIT 100) a;
- 执行计划(EXPLAIN 表节点,按 JOIN 顺序):
| # | 表 | 访问类型 | 使用索引 | 候选索引 | 预扫行数 | 过滤后 |
|---|
| 1 | a | ❌ 全表扫描 | — | — | 100 | 100.0% |
- 慢因:扫描行数远大于返回行数(200/1)、EXPLAIN 全表扫描/未用索引
- 建议:补索引(按 WHERE 等值列在前、范围列收尾建复合索引); 用 EXPLAIN 验证 key 命中
- 可执行 DDL(建议先在低峰期 EXPLAIN 验证再执行):
ALTER TABLE `t8_extends`.`t8_ware_mall_logging` ADD INDEX `idx_action_typ` (`action_type`);
7. SELECT g.id AS game_id, g.name, pg.id AS platform_game_id, pg.platform_app_id FROM t8_platform_games pg INNER JOIN t8_games g ON g.id = pg.game_id WHERE pg.plat —— 1,080 次 × 1.88s = 33.8min
SELECT
g.id AS game_id,
g.name,
pg.id AS platform_game_id,
pg.platform_app_id
FROM t8_platform_games pg
INNER JOIN t8_games g
ON g.id = pg.game_id
WHERE pg.platform_id = 1
AND pg.enable = 1
AND pg.id > 0
AND pg.platform_app_id IS NOT NULL
AND pg.platform_app_id <> ''
AND g.type = 'game'
AND g.enable = 1
AND NOT EXISTS (
SELECT 1
FROM t8_platform_game_media pgm
WHERE pgm.platform_game_id = pg.id
AND pgm.scene_type = 7
LIMIT 1
)
ORDER BY pg.id ASC
LIMIT 450;
- 库表:t8_game.t8_platform_games;实例 alias:
prod-8591/8591-b
- explain SQL:
SELECT
g.id AS game_id,
g.name,
pg.id AS platform_game_id,
pg.platform_app_id
FROM `t8_game`.`t8_platform_games` pg
INNER JOIN `t8_game`.`t8_games` g
ON g.id = pg.game_id
WHERE pg.platform_id = 1
AND pg.enable = 1
AND pg.id > 0
AND pg.platform_app_id IS NOT NULL
AND pg.platform_app_id <> ''
AND g.type = 'game'
AND g.enable = 1
AND NOT EXISTS (
SELECT 1
FROM `t8_game`.`t8_platform_game_media` pgm
WHERE pgm.platform_game_id = pg.id
AND pgm.scene_type = 7
LIMIT 1
)
ORDER BY pg.id ASC
LIMIT 450;
- 执行计划(EXPLAIN 表节点,按 JOIN 顺序):
| # | 表 | 访问类型 | 使用索引 | 候选索引 | 预扫行数 | 过滤后 |
|---|
| 1 | g | ref | type | PRIMARY,type | 208,003 | 10.0% |
| 2 | pg | ref | idx_enable_game | PRIMARY,idx_bid,idx_platform,idx_enable_game | 1 | 25.0% |
- 计划标志:⚠️ filesort 排序、⚠️ 产生临时表
- 慢因:扫描行数远大于返回行数(1,853,544/450)、DISTINCT/GROUP BY 产生临时表(大范围去重/聚合)、排序未走索引(filesort)
- 建议:补索引(按 WHERE 等值列在前、范围列收尾建复合索引); 用 EXPLAIN 验证 key 命中; 缩小聚合/去重范围(补时间等过滤条件), 或预聚合到中间表/定时任务; 把 ORDER BY 列纳入复合索引, 或减小排序前扫描范围
- 可执行 DDL(建议先在低峰期 EXPLAIN 验证再执行):
ALTER TABLE `t8_game`.`t8_platform_games` ADD INDEX `idx_game_id_platform_i_enable_platform_a_id` (`game_id`, `platform_id`, `enable`, `platform_app_id`, `id`);
ALTER TABLE `t8_game`.`t8_games` ADD INDEX `idx_type_enable` (`type`, `enable`);
ALTER TABLE `t8_game`.`t8_platform_game_media` ADD INDEX `idx_platform_g_scene_type` (`platform_game_id`, `scene_type`);
- DDL 注:
t8_platform_games 与现有索引 idx_bid(game_id) 前缀重复(game_id), 新索引生效后可评估删除旧索引
- DDL 注:
t8_games 与现有索引 type(type) 前缀重复(type), 新索引生效后可评估删除旧索引
- DDL 注:
t8_platform_game_media 与现有索引 idx_paid(platform_game_id) 前缀重复(platform_game_id), 新索引生效后可评估删除旧索引
8. SELECT id FROM ware_item WHERE id > ? AND status > ? AND (actionTime BETWEEN ? AND ? ) ORDER BY id ASC LIMIT ?; —— 1,080 次 × 1.65s = 29.7min
SELECT `id` FROM `ware_item` WHERE id > 0 AND status > 0 AND (actionTime BETWEEN 1792346130 AND 1792349670 ) ORDER BY id ASC LIMIT 1000;
- 库表:a8591.ware_item;实例 alias:
prod-8591/8591-a
- explain SQL:
SELECT `id` FROM `a8591`.`ware_item` WHERE id > 0 AND status > 0 AND (actionTime BETWEEN 1792346130 AND 1792349670 ) ORDER BY id ASC LIMIT 1000;
- 执行计划(EXPLAIN 表节点,按 JOIN 顺序):
| # | 表 | 访问类型 | 使用索引 | 候选索引 | 预扫行数 | 过滤后 |
|---|
| 1 | ware_item | range | PRIMARY | PRIMARY,status | 459,812 | 5.56% |
- 慢因:扫描行数远大于返回行数(3,215,958/615)
- 建议:补索引(按 WHERE 等值列在前、范围列收尾建复合索引); 用 EXPLAIN 验证 key 命中
逐条优化建议汇总
P 行 = 深析模式(指纹聚合,按全天累计耗时降序 P1 最大,是优化主战场);T 行 = 单条耗时 Top3 的一次性慢 SQL(多为 bi/导出查询,治理手段通常是限流/降频/移到从库,而非建索引)。
| 编号 | 对象 | 建议 |
|---|
| P1 | a8591.t8_user_id_card_number_list(2,983×3.5s) | 补索引(按 WHERE 等值列在前、范围列收尾建复合索引); 用 EXPLAIN 验证 key 命中; 扩复合索引: 把其余 WHERE 等值列追加到现有索引尾部, 避免 10 万+ 行回表; DDL: ALTER TABLE a8591.t8_user_id_card_number_list ADD INDEX idx_img_type_status_ocr_result (img_type, status, ocr_result); |
| P2 | a8591.t8_money_trade_log(142×56.4s) | 补索引(按 WHERE 等值列在前、范围列收尾建复合索引); 用 EXPLAIN 验证 key 命中; DDL: ALTER TABLE a8591.t8_money_trade_log ADD INDEX idx_account_created_at (account, created_at); |
| P3 | t591.t1_design_img(2,720×1.4s) | 补索引(按 WHERE 等值列在前、范围列收尾建复合索引); 用 EXPLAIN 验证 key 命中; DDL: ALTER TABLE t591.t1_design_img ADD INDEX idx_w_id_id (w_id, id); ALTER TABLE t591.t1_design_work ADD INDEX idx_check_stat_is_show_is_hide_publish_ti (check_status, is_show, is_hide, publish_time);; 缩小聚合/去重范围(补时间等过滤条件), 或预聚合到中间表/定时任务; 把 ORDER BY 列纳入复合索引, 或减小排序前扫描范围 |
| P4 | a8591.t8_mall_stat(1×2876.2s) | 补索引(按 WHERE 等值列在前、范围列收尾建复合索引); 用 EXPLAIN 验证 key 命中; DDL: ALTER TABLE a8591.t8_mall_stat ADD INDEX idx_created_at (created_at);; 把 ORDER BY 列纳入复合索引, 或减小排序前扫描范围; 改分页/按需列, 避免 SELECT * 整表捞取; 大导出走离线通道 |
| P5 | t591.t1_design_img(782×3.0s) | 结合 SQL 文本与执行计划人工复核; 考虑降频/缓存 |
| P6 | t8_extends.t8_ware_mall_logging(292×7.6s) | 补索引(按 WHERE 等值列在前、范围列收尾建复合索引); 用 EXPLAIN 验证 key 命中; DDL: ALTER TABLE t8_extends.t8_ware_mall_logging ADD INDEX idx_action_typ (action_type); |
| P7 | t8_game.t8_platform_games(1,080×1.9s) | 补索引(按 WHERE 等值列在前、范围列收尾建复合索引); 用 EXPLAIN 验证 key 命中; DDL: ALTER TABLE t8_game.t8_platform_games ADD INDEX idx_game_id_platform_i_enable_platform_a_id (game_id, platform_id, enable, platform_app_id, id); ALTER TABLE t8_game.t8_games ADD INDEX idx_type_enable (type, enable); ALTER TABLE t8_game.t8_platform_game_media ADD INDEX idx_platform_g_scene_type (platform_game_id, scene_type);; 缩小聚合/去重范围(补时间等过滤条件), 或预聚合到中间表/定时任务; 把 ORDER BY 列纳入复合索引, 或减小排序前扫描范围 |
| P8 | a8591.ware_item(1,080×1.7s) | 补索引(按 WHERE 等值列在前、范围列收尾建复合索引); 用 EXPLAIN 验证 key 命中 |
| T1 | Top1 单条最慢 1.64h,user=databasus_backup a8591.t8_ware_item_desc | 补索引(按 WHERE 等值列在前、范围列收尾建复合索引); 用 EXPLAIN 验证 key 命中; bi/导出类: 限流降频、移从库/离线跑, 避免高峰占用主库 |
| T2 | Top2(同 P4 对象) 单条最慢 1.05h,user=bi a8591.t8_mall_stat | 补索引(按 WHERE 等值列在前、范围列收尾建复合索引); 用 EXPLAIN 验证 key 命中; DDL: ALTER TABLE a8591.t8_mall_stat ADD INDEX idx_created_at (created_at);; 把 ORDER BY 列纳入复合索引, 或减小排序前扫描范围; bi/导出类: 限流降频、移从库/离线跑, 避免高峰占用主库 |
| T3 | Top3 单条最慢 51.4min,user=bi ?.? | 补索引(按 WHERE 等值列在前、范围列收尾建复合索引); 用 EXPLAIN 验证 key 命中; bi/导出类: 限流降频、移从库/离线跑, 避免高峰占用主库 |
*采集脚本 .agents/scripts/mysql_slow_prod_report.py,中间数据 outputs/slow_report_prod8591_20261019.json;全程只读。*