MySQL作为子查询运行查询比普通查询更快

时间:2011-03-09 19:13:45

标签: mysql subquery

有谁能告诉我为什么这个子查询方法比普通查询更快?据我所知,它们在理论上是相同的:S

SELECT
    temp.`[thing]`,
FROM ( SELECT 
    `[thing]`
FROM 
    `[table]`  
WHERE 
    [things] ) temp

比以下更快:

SELECT 
    `[thing]`
FROM 
    `[table]`  
WHERE 
    `[things]`

子查询中的那个快了5倍......

有人能告诉我配置中的哪些内容会导致这样的问题吗?

干杯。

考虑到很多人没有得到我会改写的问题。查询执行相同的操作。它们是相同的,但在一个结果中,结果是从外部查询引用的,另一个是简单的。

SELECT `name` FROM `members` WHERE `member_id` = 1

SELECT tmp.`name` FROM ( SELECT `name` FROM `members` WHERE `member_id` = 1 ) tmp

让我们说member_id是主键,是唯一的成员索引。

您想要了解这个奇怪问题的任何其他信息只需在评论中提出,我会提供。我只是不知道是什么导致了这个问题因此缺乏一般信息而且问题是“我的设置中可能会导致这种情况”。

自己动手,运行一个通用的SELECT语句,然后在子查询中再次运行它,看看它在你的系统上是否更快。

编辑:接受的回答并不是真正的答案,但这是我给出的唯一答案,所以我会关闭这个问题。

2 个答案:

答案 0 :(得分:0)

这是一个错字还是你在子选择中预过滤表?

{p> [things][thing]语句

中的WHERE进行对比

答案 1 :(得分:0)

唯一合理的解释是缓存。不仅是MySQL缓存,还包括磁盘缓存等操作系统级缓存。即使您使用SQL_NO_CACHE缓存指令,这也意味着MySQL不会缓存该查询结果。 MySQL仍将通过常规缓存方法缓存索引和表。

您确实需要确保清除缓存,然后反转查询,先运行子选择。然后看看你是否得到了相同的结果。此外,您应该多次运行它们。您很可能会看到只有第一个查询“慢”。