mySQL中子查询的结构以获得最佳性能

Oct*_*ent 4 mysql sql database performance subquery

在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
Run Code Online (Sandbox Code Playgroud)

但是,在mySQL中,这种运行速度很慢 - 随着您添加更多子查询,性能会继续下降.我确定它与引擎盖下的操作顺序有关,但我的问题是如何优化这个查询?如何将第二个表中的所有值转换为结果集中的列?希望这不必用多个JOIN语句来完成(因为我不太了解JOINS)......?

Ari*_*ion 5

我建议你使用LEFT JOIN相关表格.因为如果你使用a,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
Run Code Online (Sandbox Code Playgroud)

你懂:

SELECT
    (SELECT RelatedColumn1 FROM tbl_related WHERE record_id=a1.record_id) 
    AS pseudocolumn1
Run Code Online (Sandbox Code Playgroud)

可能在将来引起问题.如果您的一个子查询返回多个值,会发生什么?你可能会得到一个例外,说子查询不能返回更多的一个值.所以如果你计划将来做这样的子查询.至少有一个TOP 1on,以便查询不会崩溃.像这样:

SELECT
    (SELECT TOP 1 RelatedColumn1 FROM tbl_related WHERE record_id=a1.record_id) 
    AS pseudocolumn1
Run Code Online (Sandbox Code Playgroud)