哪个查询执行速度更快,哪个查询完美?
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)
我已经放置了两个查询,都会输出相同的结果.现在我想知道哪种方法执行速度更快,哪种方法更正确?
您应该始终使用它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)
| 归档时间: |
|
| 查看次数: |
333 次 |
| 最近记录: |