【发布时间】:2022-01-28 09:51:48
【问题描述】:
我希望优化下面的查询,该查询具有来自关系表的子查询,并按子查询计数数据排序。请参阅以下查询:
SELECT table1.*,
( SELECT COUNT(*)
FROM table2
WHERE table2.user_id=table1.id
AND table2.deleted = 0) AS table2_total
FROM table1
WHERE table1.parent_id = 0
ORDER BY table2_total DESC LIMIT 0, 50
此查询运行良好,但当 table2 的数据超过 50K 时它会卡住。我也尝试使用左连接而不是子查询,但这更慢:
SELECT table1.*,
COUNT(DISTINCT table2.id) as table2_total
FROM table1
LEFT JOIN table2 ON table2.user_id=table1.id
AND table2.deleted = 0
WHERE table1.parent_id = 0
ORDER BY table2_total DESC LIMIT 0, 50
table2 已经在 user_id 和已删除列上有索引。请看下表2结构:
有什么方法可以更好地优化这个查询吗?
【问题讨论】:
-
您需要 table1 的所有列还是需要某些特定列?
-
我需要 table1 中的所有列 :)
-
当您询问优化时,您必须提供精确的服务器版本,为所有表完成 CREATE TABLE 并为要优化的查询提供 EXPLAIN。至少。
-
尝试通过
table2 (deleted, user_id)创建索引。以防万一,创建一个索引table2 (user_id, deleted)。然后检查 EXPLAIN - 它们中的哪一个会被使用? -
显示这个。并解释。