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

标签 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 语句,然后在子查询中再次运行它,看看它在您的系统上是否更快。

编辑:接受的答案并不是真正的答案,但这是我得到的唯一答案,所以我将关闭这个问题。

最佳答案

唯一合理的解释是缓存。不仅是 MySQL 缓存,还有像磁盘缓存这样的操作系统级缓存。即使您使用 SQL_NO_CACHE 缓存指令,这也只是意味着 MySQL 不会缓存该查询结果。 MySQL仍然会通过正常的缓存方式缓存索引和表。

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

关于MySQL 作为子查询运行查询比普通查询更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5250942/

相关文章:

按日期排序时,MySQL 数据库使用 "Using where; Using temporary; Using filesort"

mysql - 来自容器外部的 MySQL 内部错误

MySQL 错误 1242,即使使用 ANY

mysql - 有没有办法从嵌套查询返回计算值?

php - 我怎样才能在每列中显示 10 条记录,然后在 while 循环中自动在下一列中显示剩余的记录?

php - MySQL 查询结果未存储在数组中

MySQL Query 以列出基于单个玩家和命中的总命中统计?

sql - 具有语法错误的 PostgreSQL 子查询给出了有效结果

SQL:帮助嵌套查询

mysql - 将查询保存在变量中然后添加 where 子句?