我正在尝试查询我们的整个数据库以构建一份报告,但我遇到了一个问题,即像下面这样的查询需要将近 2 个小时才能运行,有些甚至需要更长的时间。我已经更改了一些名称,但结构是相同的。
Person_table 大约有 500 万行
check_table 是 Person_table 的子集,大约有 300 万行
event_table 有大约 2000 万行
update check_table as CT
inner join
( SELECT B1.id
from Person_table as PT
inner join event_table as B1 ON PT.id = B1.person_id
inner join event_type_table as E using (code_id)
inner join
( SELECT *
from event_table as ET
where ET.code_id in ('XYZ','ABC','DEF','ETC.')
) as F ON ET.id = F.person_id
and B1.Event_date = F.event_date
) as B2 using (id) set flag_1=1;
我试图解释我必须做的许多查询,但它总是吐出“解释数据不可用于声明”。
可能(或不可能)添加一些复合索引来加速查询。可能(或不可能)重新制定查询以加快速度 - 也许通过将子查询转换为
JOINs
.但似乎 3M 可能的更新无论如何都会导致查询速度非常慢。我建议
UPDATE
一次将其分成不超过 1000 行。这将避免干扰其他流量的各种锁。而且它实际上可能运行得更快——因为它不需要等待数百万行的潜力ROLLBACK
。分块讨论:http: //mysql.rjweb.org/doc.php/deletebig#deleting_in_chunks
如果您希望我检查您的索引,请提供
SHOW CREATE TABLE
。