我知道这一定是一个相当普遍的问题,我确信答案很容易获得,但我不知道如何表达我的搜索,所以我不得不在很大程度上自己解决这个问题。
表 A
id | content_id | score
1 | 2 | 16
2 | 2 | 4
3 | 3 | 8
4 | 3 | 12
表 B
id | content
1 | "Content Goes Here"
2 | "Content Goes Here"
3 | "Content Goes Here"
目标:对表 A 中的所有分数求和,按唯一的 content_id 分组,并显示与 id 关联的内容,按总分排序。
当前工作查询:
SELECT a.content_id, b.content, SUM(a.score) AS sum
FROM table_a a
LEFT JOIN table_b b ON a.content_id = b.id
GROUP BY a.content_id
ORDER BY sum ASC;
问题:据我所知,按照我构建查询的方式,通过遍历 table_a 上的每条记录、检查 table_b 中具有相同 ID 的记录并获取内容字段,从 table_b 中获取内容。这里的问题是table_a 中有近500k+ 条记录,而table_b 中有112 条记录。这意味着可能会执行 500,000 x 112 交叉表查找/匹配,仅将 112 个唯一内容字段附加到最终结果集中的总共 112 个结果中。
帮助!:如何更有效地将 table_b 中的 112 个内容字段附加到查询产生的 112 个结果中?我猜它与查询执行顺序有关,比如在生成总和之后以某种方式仅查找内容字段并将其附加到匹配的结果行并将其缩小到只有 112 条记录?研究过 MySQL API 并对各种子查询、几个连接进行了基准测试,甚至尝试过使用 UNION。这对你们来说可能是非常明显的事情,但我的大脑就是无法绕过它。
仅供参考:如前所述,查询确实有效。结果在大约 8 到 10 秒内产生,当然,由于查询缓存,之后的每个后续查询都是立即的。但对我来说,这很简单,我知道 8 秒至少可以缩短一半。我只是在我的内心深处感觉到它。就在我的胆量深处。
我希望这足够简洁,如果我需要澄清或解释更好的东西,请告诉我!提前致谢。