在mySQL中,子查询的结构对性能有何影响?

4
在MS SQL Server中,这个查询正常运行:
SELECT column1
    , (SELECT RelatedColumn1 FROM tbl_related WHERE record_id=a1.record_id) AS pseudocolumn1
    , (SELECT RelatedColumn2 FROM tbl_related WHERE record_id=a1.record_id) AS pseudocolumn2
    , (SELECT RelatedColumn3 FROM tbl_related WHERE record_id=a1.record_id) AS pseudocolumn3
    , (SELECT RelatedColumn4 FROM tbl_related WHERE record_id=a1.record_id) AS pseudocolumn4
     ... [20 or more subqueries here] ...
FROM tbl_primary a1

在mySQL中,这个查询运行非常慢 - 并且随着添加更多的子查询,性能会继续降低。我相信这与底层操作顺序有关,但我的问题是如何优化此查询?如何将第二个表中的所有值旋转到结果集中的列中?希望这不必通过多个JOIN语句来完成(因为我不太理解JOIN)。

如何优化这个查询 - 将其重写为一个连接,这很容易。 - zerkms
“如何将第二个表中的所有值旋转到结果集中的列中?”这句话是什么意思?你的例子暗示它们已经是同一行中的不同列。你是不是想说RelatedColumn1实际上与RelatedColumn2在不同的上?*[如果现有答案不能满足您的需求,也许您可以提供两个示例表的结构?]* - MatBailie
3个回答

5

我建议您使用 LEFT JOIN 到相关表。因为如果您使用 JOIN,那么如果 tbl_related 没有与该 id 相关的行,则该行将从结果中排除。

SELECT
    column1,
    tbl_related.RelatedColumn1,
    tbl_related.RelatedColumn2,
    tbl_related.RelatedColumn3,
    tbl_related.RelatedColumn4,
    tbl_related.RelatedColumn5
    .....
FROM
    tbl_primary a1
LEFT JOIN tbl_related 
    ON tbl_related.record_id=a1.record_id

您知道:

SELECT
    (SELECT RelatedColumn1 FROM tbl_related WHERE record_id=a1.record_id) 
    AS pseudocolumn1

未来可能会出现问题。如果您的子查询返回多个值,会发生什么?您可能会收到异常消息,指出子查询不能返回多个值。因此,如果您计划在将来执行此类子查询,请至少在其上添加TOP 1,以便查询不会崩溃。像这样:

SELECT
    (SELECT TOP 1 RelatedColumn1 FROM tbl_related WHERE record_id=a1.record_id) 
    AS pseudocolumn1

2

SQL 101:

SELECT 
    column1,
    r.RelatedColumn
FROM tbl_primary a1
JOIN tbl_related r
ON r.record_id = a1.recordId

2
您应该使用 JOIN 子句。
 SELECT a1.column1,
        rt.RelatedColumn
 FROM tbl_primary a1
 LEFT JOIN tbl_related ON a1.record_id = rt.record_id

LEFT JOIN是最佳选择! - aF.
@aF - 假设他想要返回 tbl_primary 表中的所有行,而不管它们是否匹配。我对查询的解释是,他想要返回匹配的行,这个观点是基于 OP 在他们的帖子中声明 "record_id=a1.record_id"。 - Darren
问题中提供的查询包括所有匹配和不匹配的内容。 - aF.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接