【发布时间】:2023-03-19 14:43:01
【问题描述】:
我有一个 Select 查询,它在具有超过 400 万条记录的事务表上执行。每当我执行此查询时,我观察到该特定事务表上的所有写入和更新操作都已挂起,并且我们开始从 Java 端获取超过锁定等待超时的异常,请尝试重新启动事务。当前锁定等待超时设置为 200 秒。我无法理解为什么 select 语句可以在表上创建这样的锁并阻止所有插入/更新语句。 表存储引擎是 InnoDb,主键是自增键。 MySQL 版本是 5.1.40。执行此查询时我没有开始任何事务
有什么想法吗?
这里是查询
选择 cd.acc_id accId, cast(cd.ci_time 作为日期) trdate, 合并(cd.cnumber,替换(cd.executer_id,'+',''))作为 cno, 案子 WHEN coalesce(cd.language, 'English') = 'English' 那么 1 其他 2 END 作为语言, 案子 当 cd.cnumber 为空时 然后'N' 否则'Y' 结尾 iscno, 替换(cd.execute_id,'+','')执行者_id, 计数(*) trcount, 总和(合并 ( ( 选择 计数(DISTINCT distribution_log.dist_id) 从 分布日志, distribution_log_detail 在哪里 distribution_log.distribution_log_id = distribution_log_detail.distribution_log_id AND distribution_log_detail.service_id 不在('P1','P3') 和 distribution_log.state_id = '注册' AND distribution_log.dist_id = cd.dist_id ) , 0 ) ) accAbandonduring, 和( 案子 何时合并 ( ( 选择 计数(DISTINCT distribution_log.dist_id) 从 分布日志 在哪里 分布日志.acc_id = 58 AND distribution_log.dist_id = cd.dist_id 和 distribution_log.state_id = '注册' ) ,0 )
0 那么 0 其他 1 结尾 ) accAbandonedbe, 总和(合并 ( ( 选择 数数(*) 从 cq_detail cqd 在哪里 cqd.dist_id = cd.dist_id ) ,0 ) ) 作为 opted_for_csr, 总和(合并 ( ( 选择 计数(DISTINCT cqd.dist_id) 从 cq_detail cqd, ca_detail cad 在哪里 cqd.dist_id = cd.dist_id AND cad.dist_id = cd.dist_id 通过...分组 cqd.dist_id 拥有 总和(cad.agent_answered_flag)> 0 ) ,0 ) ) 作为 csr_trs_ans, 总和(合并 ( ( 选择 计数(DISTINCT cqd.dist_id) 从 cq_detail cqd 在哪里 cqd.dist_id = cd.dist_id AND FAnswer(cqd.dist_id) = 0 AND time_to_sec(timediff(cqd.cq_end_time, cqd.cq_init_time)) = 60 ) ,0 ) ) 作为 abon_at_csr_abv, 总和(合并 ( 案子 什么时候 ( 选择 计数(DISTINCT distribution_log.dist_id) 从 分布日志, distribution_log_detail 在哪里 distribution_log.distribution_log_id = distribution_log_detail.distribution_log_id AND distribution_log_detail.service_id = 'P1' 和 distribution_log_detail.resp_code = '00' AND distribution_log.dist_id = cd.dist_id ) 0 那么 1 结尾 , 0 ) ) 作为 acc_successful, 总和(合并 ( 案子 什么时候 ( 选择 计数(DISTINCT distribution_log.dist_id) 从 分布日志, distribution_log_detail 在哪里 distribution_log.distribution_log_id = distribution_log_detail.distribution_log_id AND distribution_log_detail.service_id = 'P1' 和 distribution_log_detail.resp_code '00' AND distribution_log.dist_id = cd.dist_id ) 0 那么 1 结尾 , 0 ) ) 作为 acc_unsuccessful 从 tr_detail 光盘 在哪里 cd.acc_id = 58 AND cd.ci_time >= '2009/11/05' AND cd.ci_time
【问题讨论】:
标签: mysql