我们的问题在于在两个大表(两个都有数百万个条目)上执行左连接。
第一个是包含由我们程序的最终用户提供的输入的表。它包含各种问题的答案。每个问题都属于某个问卷。最重要的列是给定响应的标识符,问卷表单的标识符,给出答案的日期时间以及提供答案的用户的标识符。
第二个表包含有关完成问卷的用户每日进度的信息。它包含特定用户在特定日期为给定活动提供的答案数量的信息。此表中最重要的列是用户ID,问卷ID和日期。
第二个数据库在新答案进入第一个数据库后立即更新。更新由在不同服务器上运行的代码(工作程序)执行。我们希望使系统能够抵御其他服务器的故障。确保包含结果的表格('响应')与进度(' progress_questionnaires')表保持同步的一个重要步骤是能够检查user_id的组合,来自“回复”的问卷调查表和日期时间'表格也出现在“进度报告”中。表。下面显示了一个查询,该查询捕获所需的结果,但不在大型数据库(NxN,其中N是几百万个条目)上执行。
捕获所需结果的查询是:
SELECT r.chapter_id, r.user_id, CAST(first_created as date) as date, 1 as original
FROM responses r
LEFT JOIN progress_questionnaires pq ON r.questionnaire_id = pq.questionnaire_id AND r.user_id = pq.user_id AND CAST(r.first_created as date) = pq.date
WHERE pa.activity_id IS NULL
GROUP BY r.questionnaire_id, r.user_id, CAST(r.first_created as date)
如前所述,此查询确实捕获了所需的结果,但在大型表上执行效果不佳。据我们所知,所有关键列都已正确编入索引。
如果有人可以帮助我们,我们将非常高兴。
P.S。我们使用的是MariaDB,SQL版本5.5.43。我希望我提供了必要的信息,但从逻辑上讲,我很乐意在必要时提供更多信息。