Aurora MySQL中特定记录查询与宽泛查询结果不一致问题
Amazon Aurora MySQL 查询结果丢失问题排查
问题场景
在Amazon Aurora MySQL数据库中遇到如下问题:
- 特定查询(Query 1) 能成功检索到1条目标记录
- 去除
incident_uuid条件的宽泛查询(Query 2,含/不含DISTINCT) 无法返回该目标记录
涉及查询语句
Query 1(正常返回目标记录)
SELECT * FROM data_alerts.log_table WHERE incident_uuid = 63756315 AND run_status_flag = 'FAILED' AND job_name = 'lambda:LH_lambda' AND incident_category = 'LH' AND created_at_time >= CURDATE() - INTERVAL 1 DAY;
Query 2(含DISTINCT,丢失目标记录)
SELECT distinct job_details FROM data_alerts.log_table WHERE incident_category = 'LH' AND run_status_flag = 'FAILED' AND created_at_time >= CURDATE() - INTERVAL 1 DAY AND job_name = 'lambda:LH_lambda' ORDER BY created_at_time;
无DISTINCT的宽泛查询(同样丢失目标记录)
SELECT job_details FROM data_alerts.log_table WHERE incident_category = 'LH' AND run_status_flag = 'FAILED' AND created_at_time >= CURDATE() - INTERVAL 1 DAY AND job_name = 'lambda:LH_lambda' ORDER BY created_at_time;
可能原因及排查方案
1. 目标记录的job_details字段为NULL或特殊值
如果目标记录的job_details是NULL,部分客户端工具会默认隐藏NULL值行,导致你误以为记录丢失。
- 排查:执行Query 1时单独查看
job_details的值:SELECT job_details FROM data_alerts.log_table WHERE incident_uuid = 63756315 AND run_status_flag = 'FAILED' AND job_name = 'lambda:LH_lambda' AND incident_category = 'LH' AND created_at_time >= CURDATE() - INTERVAL 1 DAY; - 如果确实是NULL,检查Query 2的结果总数:
如果结果为1,说明记录在Query 2的结果集中,只是客户端未显示NULL行。SELECT COUNT(*) FROM data_alerts.log_table WHERE incident_category = 'LH' AND run_status_flag = 'FAILED' AND created_at_time >= CURDATE() - INTERVAL 1 DAY AND job_name = 'lambda:LH_lambda' AND incident_uuid = 63756315;
2. 索引统计信息过时导致查询计划错误
Aurora MySQL的查询优化器依赖表的统计信息生成执行计划,如果统计信息过时,可能导致Query 2走了错误的索引,过滤掉了目标记录。
- 解决:刷新表的统计信息后重新执行Query 2:
ANALYZE TABLE data_alerts.log_table;
3. ORDER BY子句导致记录被排至结果集末尾
Query 2使用ORDER BY created_at_time,如果目标记录的created_at_time值特殊(比如为NULL,或远早/远晚于其他记录),可能被排在结果集最后,你未注意到。
- 排查:去除
ORDER BY子句后执行Query 2,直接查看结果:
或者强制按SELECT job_details FROM data_alerts.log_table WHERE incident_category = 'LH' AND run_status_flag = 'FAILED' AND created_at_time >= CURDATE() - INTERVAL 1 DAY AND job_name = 'lambda:LH_lambda';incident_uuid排序定位目标记录:SELECT job_details, incident_uuid FROM data_alerts.log_table WHERE incident_category = 'LH' AND run_status_flag = 'FAILED' AND created_at_time >= CURDATE() - INTERVAL 1 DAY AND job_name = 'lambda:LH_lambda' ORDER BY incident_uuid;
4. 隐式数据类型转换导致条件过滤异常
虽然Query 1和Query 2的WHERE条件一致,但如果字段类型与条件值类型不匹配(比如incident_uuid是VARCHAR类型,Query 1中用数字63756315匹配),可能触发隐式转换,导致Query 2的执行计划中对其他条件的过滤逻辑异常。
- 排查:查看表结构,确认字段类型:
如果DESC data_alerts.log_table;incident_uuid是字符串类型,修改Query 1的条件为字符串匹配(incident_uuid = '63756315'),再对比Query 2的结果。
5. 事务隔离级别或数据一致性问题
如果Query 1在事务中执行,而Query 2在另一个事务中,且隔离级别为REPEATABLE READ(Aurora MySQL默认),可能导致Query 2看不到未提交的修改;或者目标记录在Query 1执行后被修改/删除。
- 排查:在同一会话中先后执行Query 1和Query 2,确认结果是否一致;或者检查目标记录是否存在:
SELECT EXISTS(SELECT 1 FROM data_alerts.log_table WHERE incident_uuid = 63756315);
内容的提问来源于stack exchange,提问作者pavanas poojary
相关产品推荐
相关产品推荐

