哪个MySQL查询更快?

Miq*_*Ali 1 mysql database

哪个查询执行速度更快,哪个查询完美?

SELECT
    COUNT(*) AS count
FROM
    students
WHERE
    status = 1
AND
    classes_id IN(
                    SELECT
                        id
                    FROM
                        classes
                    WHERE
                        departments_id = 1
                );
Run Code Online (Sandbox Code Playgroud)

要么

SELECT
    COUNT(*) AS count
FROM
    students s
LEFT JOIN
    classes c
ON
    c.id = s.classes_id
WHERE
    status = 1
AND
    c.departments_id = 1
Run Code Online (Sandbox Code Playgroud)

我已经放置了两个查询,都会输出相同的结果.现在我想知道哪种方法执行速度更快,哪种方法更正确?

Mar*_*ams 5

您应该始终使用它EXPLAIN来确定查询的运行方式.

不幸的是,MySQL会将子查询作为DEPENDENT QUERY执行,这意味着将为外部查询中的每一行运行子查询.你会认为MySQL足够聪明,可以检测到子查询不是一个相关的子查询,只会运行一次,唉,它还不是那么聪明.

因此,MySQL将扫描学生中的所有行,为每行运行子查询,而不使用外部查询的任何索引.

将查询编写为JOIN将允许MySQL使用索引,以下查询将是编写它的最佳方式:

SELECT COUNT(*) AS count
FROMstudents s
JOIN classes c
  ON c.id = s.classes_id
  AND c.departments_id = 1
WHERE s.status = 1
Run Code Online (Sandbox Code Playgroud)

这将使用以下索引:

students(`status`)
classes(`id`, `departements_id`) : multi-column index
Run Code Online (Sandbox Code Playgroud)