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

标签 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

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

最佳答案

我建议您对相关表使用 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

关于mysql - mySQL 中的子查询结构以获得最佳性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10350265/

相关文章:

php - mysql表中多表行插入

树莓派上的 JavaScript

sql - SQL-内部联接2个表,但如果1个表为空则返回全部

mongodb - MongoDB 数据库中的数据如何存储在磁盘上?

mysql - 从多行插入并同时更新一些静态值?

mysql - 使用批处理脚本将表导出到 csv 时在末尾添加额外文本

javascript - 我想将可更改的数据存储在表行的一列中

python - 为 JSON API 选择 RethinkDB 而不是传统 SQL 有多合适?

mysql - MySQL中将逗号分隔的输入参数转换为int行的函数

php - 如何从表中选择多行并放入单独的数组中?