📋 目录统计概览Top10 明细(按单条耗时)高频慢查询模式(指纹聚合,取样 10,147 条触发深度分析的模式(条数>100 或 累计>30逐条优化建议汇总

MySQL 慢查询日报(线上 prod8591)2026-09-09

统计概览

项目值
统计范围2026-09-09 00:00:00 ~ 23:59:59(Asia/Shanghai)
环境prod-8591
慢日志条数(ES mysql-slow_*)0 条(指纹聚合取样 10,147 条)
Top10 单条最慢4,796.88 s(user=bi,ZHDX_t8591_107)
非备份模式最大累计2.24h(172 次 × 46.83 s)
备份模式(user 含 backup/databasus_backup)287 条、累计 2.60h(单独标注,不触发深析)
深析模式 explain 成功率3/8(38%) ⚠️ 规则退化告警:explain 获取率过低,慢因多为兜底';其他',请检查 MCP 实例映射/超时
数据来源ES mysql-slow_*(@timestamp)+ MCP 只读 MySQL(describe_schema/explain)
生成时间2026-09-10 09:52(Asia/Shanghai)

Top10 明细(按单条耗时)

#耗时(s)库.表行数 sent/examineduser / server慢因分类
14,796.88None.t8_mall_stat161,341,967 / 322,683,934bi / ZHDX_t8591_107其他(需结合 SQL 与执行计划人工判断)
23,836.78None.t8_mall_stat161,513,238 / 323,026,476bi / ZHDX_t8591_107其他(需结合 SQL 与执行计划人工判断)
33,018.88None.ware_item_history66 / 32,017,787bi / ZHDX_t8591_107扫描行数远大于返回行数(32,017,787/66)
42,990.17None.t8_mall_stat161,572,540 / 323,145,080bi / ZHDX_t8591_107其他(需结合 SQL 与执行计划人工判断)
52,914.49None.t8_mall_stat161,445,159 / 322,890,318bi / ZHDX_t8591_107其他(需结合 SQL 与执行计划人工判断)
62,706.28None.t8_ware_order2,928,078 / 36,510,153bi / ZHDX_t8591_107扫描行数远大于返回行数(36,510,153/2,928,078)
72,441.07None.ware_item_history1,139,378 / 9,713,418bi / ZHDX_t8591_107其他(需结合 SQL 与执行计划人工判断)
82,250.75None.ware_item_history1,138,916 / 9,705,828bi / ZHDX_t8591_107其他(需结合 SQL 与执行计划人工判断)
92,170.14None.ware_item_history65 / 32,017,786bi / ZHDX_t8591_107扫描行数远大于返回行数(32,017,786/65)
101,721.59None.t8_ware_order_item21,059,022 / 21,059,022bi / ZHDX_t8591_107其他(需结合 SQL 与执行计划人工判断)

高频慢查询模式(指纹聚合,取样 10,147 条)

按条数 Top5

#模式(指纹摘要)条数平均(s)累计serveruser
1
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,5991.3458.1minZHDX_t8591_73a591
2SELECT 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 ?;1,1013.411.04hZHDX_t8591_143,ZHDX_t8591_16,ZHDX_t8591_a8591
3select session, from, body from chat_messages where from = ? and time > ? and type = ?;8691.4320.8minZHDX_t8591_15im8591
4select count(distinct session) as num from chat_messages where from = ? and time > ? limit ?;7371.4317.5minZHDX_t8591_15im8591
5select wallet, sum(if(type = ?, amount, ?)) - sum(if(type = ?, amount, ?)) as balance from a8591.t8_money_trade_log where account = ? group by wallet;3612.7216.4minZHDX_t8591_61a8591

按累计耗时 Top5

#模式条数平均(s)累计serveruser
1select sum(searched_times) as total, keyword from t8_keyword_statistics where date between ? and ? group by keyword order by total desc limit ?;17246.832.24hZHDX_t8591_15a8591
2select 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;13155.052.00hZHDX_t8591_61a8591
3SELECT * FROM t8_mall_stat ORDER BY created_at DESC;14796.881.33hZHDX_t8591_107bi
4SELECT 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 ?;1,1013.411.04hZHDX_t8591_143,ZHDX_t8591_16,ZHDX_t8591_a8591
5
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,5991.3458.1minZHDX_t8591_73a591
备份模式全天 287 条 / 2.60h,未触发深度分析(如条数环比异常翻倍再人工介入)。

触发深度分析的模式(条数>100 或 累计>30min,非备份,最多 8 个)

1. select sum(searched_times) as total, keyword from t8_keyword_statistics where date between ? and ? group by keyword order by total desc limit ?; —— 172 次 × 46.83s = 2.24h

select sum(searched_times) as total, keyword from `t8_keyword_statistics` where `date` between '2026-08-09' and '2026-09-09' group by `keyword` order by `total` desc limit 5;
SELECT * FROM `t8_help`.`t8_keyword_statistics` LIMIT 10
#表访问类型使用索引候选索引预扫行数过滤后
1t8_keyword_statistics❌ 全表扫描——7,223,435100.0%

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 —— 131 次 × 55.05s = 2.00h

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-09-09 00:04:26' group by `wallet`;
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-09-09 00:04:26' group by `wallet`;
#表访问类型使用索引候选索引预扫行数过滤后
1t8_money_trade_logrefidx_awidx_created_at,idx_aw29,182,04850.0%

3. SELECT * FROM t8_mall_stat ORDER BY created_at DESC; —— 1 次 × 4796.88s = 1.33h

SELECT *
FROM t8_mall_stat
ORDER BY created_at DESC;

4. 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 —— 1,101 次 × 3.41s = 1.04h

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;
SELECT * FROM `a8591`.`t8_user_id_card_number_list` WHERE img_type = 2 LIMIT 10
#表访问类型使用索引候选索引预扫行数过滤后
1t8_user_id_card_number_list❌ 全表扫描——818,06010.0%
ALTER TABLE `a8591`.`t8_user_id_card_number_list` ADD INDEX `idx_img_type` (`img_type`);

5. 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,599 次 × 1.34s = 58.1min

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-09-09 00:04:45' and `t1_design_img`.`id` > 961 order by `t1_design_img`.`id` asc limit 100;
ALTER TABLE `t1_design_img` ADD INDEX `idx_check_stat` (`check_status`);

6. SELECT a.user_id AS buyerId, IFNULL(c.sellUser,IFNULL(d.sellUser,NULL)) AS sellerId, a.order_number AS orderNo, IFNULL(c.id,IFNULL(d.id,NULL)) AS txNo, a.order_ —— 1 次 × 2706.28s = 45.1min

SELECT
	a.user_id AS buyerId,
	IFNULL(c.sellUser,IFNULL(d.sellUser,NULL)) AS sellerId,
	a.order_number AS orderNo,
	IFNULL(c.id,IFNULL(d.id,NULL)) AS txNo,
	a.order_status AS orderStatus,
	IFNULL(c.status,IFNULL(d.status,NULL)) AS txStatus,
  IFNULL(e.type,IFNULL(f.type,NULL)) AS gameType,
  CONVERT(CAST(IFNULL(e.name,IFNULL(f.name,NULL)) AS BINARY) USING utf8) AS gameName,
  CONVERT(CAST(IFNULL(g.type_name,IFNULL(h.type_name,NULL)) AS BINARY) USING utf8) AS goodsType,
  CONVERT(CAST(IFNULL(c.title,IFNULL(d.title,NULL)) AS BINARY) USING utf8) AS goodsTitle,
	a.pay_by AS payMethod,
	a.user_agent AS orderClient,
	IFNULL(c.price,IFNULL(d.price,NULL)) AS price,
	a.voucher_money AS couponAmount,
	i.active_id AS activityName,
	i.coupon_id AS couponId,
	IF(IFNULL(j.set_type,IFNULL(k.set_type,NULL)) = 'specifyBuyer','yes','no') AS IF_special,
	IF(a.order_createtime NOT LIKE '0000-00-00 00:00:00', a.order_createtime, NULL) AS createTime,
	IF(a.order_paytime NOT LIKE '0000-00-00 00:00:00', a.order_paytime, NULL) AS payTime,
	FROM_UNIXTIME( IFNULL(IF(c.actionTime=0,NULL,c.actionTime),IFNULL(IF(d.actionTime=0,NULL,d.actionTime),NULL)), '%Y-%m-%d %H:%i:%s' ) AS actionTime,
	IF(a.order_canceltime NOT LIKE '0000-00-00 00:00:00', a.order_canceltime, NULL) AS cancelTime
FROM
	t8_ware_order a
	LEFT JOIN t8_ware_order_item b ON a.id = b.order_id
	LEFT JOIN ware_item c ON b.ware_id = c.id
	LEFT JOIN ware_item_history d ON b.ware_id = d.id
	LEFT JOIN gameList e ON c.gameName = e.id
	LEFT JOIN gameList f ON d.gameName = f.id
	LEFT JOIN t8_ware_type g ON c.wareType = g.id
	LEFT JOIN t8_ware_type h ON d.wareType = h.id
	LEFT JOIN t8_user_voucher i ON a.voucher_id = i.id
	LEFT JOIN ( SELECT * FROM ware_set WHERE set_type = 'specifyBuyer' ) j ON c.id = j.ware_id
	LEFT JOIN ( SELECT * FROM ware_set WHERE set_type = 'specifyBuyer' ) k ON d.id = k.ware_id
WHERE 
	a.order_createtime >= '2026-01-01' AND a.order_createtime < '2027-01-01'
ORDER BY 
	a.order_createtime DESC;
ALTER TABLE `t8_ware_order` ADD INDEX `idx_set_type` (`set_type`);

7. SELECT a.buyUser AS buyerId, a.sellUser AS sellerId, c.order_number AS orderNo, a.id AS txNo, c.order_status AS orderStatus, a.status AS txStatus, d.type AS gam —— 1 次 × 2250.75s = 37.5min

SELECT
	a.buyUser AS buyerId,
	a.sellUser AS sellerId,
	c.order_number AS orderNo,
	a.id AS txNo,
	c.order_status AS orderStatus,
	a.status AS txStatus,
	d.type AS gameType,
	CONVERT ( CAST( d.NAME AS BINARY ) USING utf8 ) AS gameName,
	CONVERT ( CAST( e.type_name AS BINARY ) USING utf8 ) AS goodsType,
	CONVERT ( CAST( a.title AS BINARY ) USING utf8 ) AS goodsTitle,
	c.pay_by AS payMethod,
	c.user_agent AS orderClient,
	a.price AS price,
	f.money AS couponAmount,
	f.active_id AS activityName,
	f.coupon_id AS couponId,
	IF ( g.set_type = 'specifyBuyer', 'yes', 'no' ) AS IF_special,
	IF ( c.order_createtime != '0000-00-00 00:00:00', c.order_createtime, NULL ) AS createTime,
	IF ( c.order_paytime != '0000-00-00 00:00:00', c.order_paytime, NULL ) AS payTime,
	FROM_UNIXTIME( IF ( a.actionTime = 0, NULL, a.actionTime ), '%Y-%m-%d %H:%i:%s' ) AS actionTime,
	IF ( c.order_canceltime != '0000-00-00 00:00:00', c.order_canceltime, NULL ) AS cancelTime
FROM
	ware_item a
	LEFT JOIN t8_ware_order_item b ON a.id = b.ware_id 
	LEFT JOIN t8_ware_order c ON b.order_id = c.id
	LEFT JOIN gameList d ON a.gameName = d.id
	LEFT JOIN t8_ware_type e ON a.wareType = e.id
	LEFT JOIN t8_user_voucher f ON b.ware_id = f.id
	LEFT JOIN ( SELECT * FROM ware_set WHERE set_type = 'specifyBuyer' ) g ON a.id = g.ware_id
WHERE
	a.postTime >= 1546272000 
	AND c.order_number IS NULL
ORDER BY 
	actionTime DESC;
ALTER TABLE `yy_t8_data`.`ware_item` ADD INDEX `idx_set_type` (`set_type`);

8. SELECT a.buyUser AS buyerId, a.sellUser AS sellerId, c.order_number AS orderNo, a.id AS txNo, c.order_status AS orderStatus, a.status AS txStatus, d.type AS gam —— 1 次 × 2170.14s = 36.2min

SELECT
	a.buyUser AS buyerId,
	a.sellUser AS sellerId,
	c.order_number AS orderNo,
	a.id AS txNo,
	c.order_status AS orderStatus,
	a.status AS txStatus,
	d.type AS gameType,
	CONVERT ( CAST( d.NAME AS BINARY ) USING utf8 ) AS gameName,
	CONVERT ( CAST( e.type_name AS BINARY ) USING utf8 ) AS goodsType,
	CONVERT ( CAST( a.title AS BINARY ) USING utf8 ) AS goodsTitle,
	c.pay_by AS payMethod,
	c.user_agent AS orderClient,
	a.price AS price,
	f.money AS couponAmount,
	f.active_id AS activityName,
	f.coupon_id AS couponId,
	IF ( g.set_type = 'specifyBuyer', 'yes', 'no' ) AS IF_special,
	IF ( c.order_createtime != '0000-00-00 00:00:00', c.order_createtime, NULL ) AS createTime,
	IF ( c.order_paytime != '0000-00-00 00:00:00', c.order_paytime, NULL ) AS payTime,
	FROM_UNIXTIME( IF ( a.actionTime = 0, NULL, a.actionTime ), '%Y-%m-%d %H:%i:%s' ) AS actionTime,
	IF ( c.order_canceltime != '0000-00-00 00:00:00', c.order_canceltime, NULL ) AS cancelTime
FROM
	ware_item_history a
	LEFT JOIN t8_ware_order_item b ON a.id = b.ware_id 
	LEFT JOIN t8_ware_order c ON b.order_id = c.id
	LEFT JOIN gameList d ON a.gameName = d.id
	LEFT JOIN t8_ware_type e ON a.wareType = e.id
	LEFT JOIN t8_user_voucher f ON b.ware_id = f.id
	LEFT JOIN ( SELECT * FROM ware_set WHERE set_type = 'specifyBuyer' ) g ON a.id = g.ware_id
WHERE
	a.postTime >= 1546272000 
	AND c.order_number IS NULL;
ALTER TABLE `ware_item_history` ADD INDEX `idx_set_type` (`set_type`);

逐条优化建议汇总

P 行 = 深析模式(指纹聚合,按全天累计耗时降序 P1 最大,是优化主战场);T 行 = 单条耗时 Top3 的一次性慢 SQL(多为 bi/导出查询,治理手段通常是限流/降频/移到从库,而非建索引)。
编号对象建议
P1t8_help.t8_keyword_statistics(172×46.8s)补索引(按 WHERE 等值列在前、范围列收尾建复合索引); 用 EXPLAIN 验证 key 命中
P2a8591.t8_money_trade_log(131×55.1s)补索引(按 WHERE 等值列在前、范围列收尾建复合索引); 用 EXPLAIN 验证 key 命中
P3?.t8_mall_stat(1×4796.9s)改分页/按需列, 避免 SELECT * 整表捞取; 大导出走离线通道
P4a8591.t8_user_id_card_number_list(1,101×3.4s)补索引(按 WHERE 等值列在前、范围列收尾建复合索引); 用 EXPLAIN 验证 key 命中; DDL: ALTER TABLE a8591.t8_user_id_card_number_list ADD INDEX idx_img_type (img_type);
P5?.t1_design_img(2,599×1.3s)补索引(按 WHERE 等值列在前、范围列收尾建复合索引); 用 EXPLAIN 验证 key 命中; DDL: ALTER TABLE t1_design_img ADD INDEX idx_check_stat (check_status);
P6?.t8_ware_order(1×2706.3s)补索引(按 WHERE 等值列在前、范围列收尾建复合索引); 用 EXPLAIN 验证 key 命中; DDL: ALTER TABLE t8_ware_order ADD INDEX idx_set_type (set_type);
P7yy_t8_data.ware_item(1×2250.8s)结合 SQL 文本与执行计划人工复核; 考虑降频/缓存
P8?.ware_item_history(1×2170.1s)补索引(按 WHERE 等值列在前、范围列收尾建复合索引); 用 EXPLAIN 验证 key 命中; DDL: ALTER TABLE ware_item_history ADD INDEX idx_set_type (set_type);
T1Top1(同 P3 对象) 单条最慢 1.33h,user=bi ?.t8_mall_stat结合 SQL 文本与执行计划人工复核; 考虑降频/缓存; bi/导出类: 限流降频、移从库/离线跑, 避免高峰占用主库
T2Top2(同 P3 对象) 单条最慢 1.07h,user=bi ?.t8_mall_stat结合 SQL 文本与执行计划人工复核; 考虑降频/缓存; bi/导出类: 限流降频、移从库/离线跑, 避免高峰占用主库
T3Top3(同 P8 对象) 单条最慢 50.3min,user=bi ?.ware_item_history补索引(按 WHERE 等值列在前、范围列收尾建复合索引); 用 EXPLAIN 验证 key 命中; DDL: ALTER TABLE ware_item_history ADD INDEX idx_set_type (set_type);; bi/导出类: 限流降频、移从库/离线跑, 避免高峰占用主库

*采集脚本 .agents/scripts/mysql_slow_prod_report.py,中间数据 outputs/slow_report_prod8591_20260909.json;全程只读。*