如何在mySQL中有效地编写大/大左连接查询?

时间:2015-08-09 10:27:55

标签: mysql database join

我们的问题在于在两个大表(两个都有数百万个条目)上执行左连接。

第一个是包含由我们程序的最终用户提供的输入的表。它包含各种问题的答案。每个问题都属于某个问卷。最重要的列是给定响应的标识符,问卷表单的标识符,给出答案的日期时间以及提供答案的用户的标识符。

第二个表包含有关完成问卷的用户每日进度的信息。它包含特定用户在特定日期为给定活动提供的答案数量的信息。此表中最重要的列是用户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。我希望我提供了必要的信息,但从逻辑上讲,我很乐意在必要时提供更多信息。

0 个答案:

没有答案