【发布时间】:2015-09-30 17:46:59
【问题描述】:
我有 2 个查询执行相同的操作并给出相同的结果集,但编写方式不同。查看他们的个人资料,他们的执行时间几乎相同:大约 0.075 秒
令人着迷的是,query#1 在“复制到 tmp 表”状态下几乎占用了整个流程的执行时间。由于查询#2 在“发送数据”状态下几乎占用了整个流程的执行时间。
所以,我的问题是:
对于 MySQL 查询来说,“发送数据”或“复制到 tmp 表”哪个状态更好?
query#1(在“复制到 tmp 表”状态下花费执行时间)
SELECT ac.album_category_id, ac.name, ac2.album_category_id, ac2.name, ac2.description, t2.total
FROM album_category ac
JOIN album_category ac2 ON ac2.parent_album_category_id = ac.album_category_id
JOIN (
SELECT a.album_category_id cat_id, SUM(result.count_image) total
FROM album a
JOIN (
SELECT IFNULL(a.parent_album_id, a.album_id) p_album_id, COUNT(ai.image_id) count_image
FROM album_image ai
JOIN album a ON a.album_id = ai.album_id
JOIN image i ON i.image_id = ai.image_id
WHERE i.is_listed = 1
GROUP BY p_album_id
) result ON result.p_album_id = a.album_id
GROUP BY a.album_category_id
) t2 ON t2.cat_id = ac2.album_category_id
ORDER BY ac.position, ac2.position
query#2(在“发送数据”状态下花费执行时间)
SELECT ac.album_category_id, ac.name, ac2.album_category_id, ac2.name, ac2.description, t3.total
FROM album_category ac
JOIN album_category ac2 ON ac2.parent_album_category_id = ac.album_category_id
JOIN (
SELECT a2.album_category_id cat_id, SUM(t2.sum_image) total
FROM album a2
JOIN (
SELECT IFNULL(a.parent_album_id, a.album_id) p_album_id, SUM(t1.count_image) sum_image
FROM album a
JOIN (
SELECT ai.album_id album_id, COUNT(ai.image_id) count_image
FROM album_image ai
JOIN image i ON i.image_id = ai.image_id
WHERE i.is_listed = 1
GROUP BY ai.album_id
) t1 ON t1.album_id = a.album_id
GROUP BY p_album_id
) t2 ON t2.p_album_id = a2.album_id
GROUP BY a2.album_category_id
) t3 ON t3.cat_id = ac2.album_category_id
ORDER BY ac.position, ac2.position
编辑
根据 jkavalik 的要求,我添加了解释。我不确定如何在文本中添加它,所以我添加了图像。希望没问题。
查询 #1 的解释
【问题讨论】:
-
要找出你需要使用EXPLAIN检查查询执行计划。请将这两个查询的计划添加到问题中。
-
好的,我已经编辑了问题并添加了解释