0

我有一个包含许多嵌套 SELECT 语句的大型查询。简化版本可能如下所示:

SELECT * FROM tableA WHERE x IN(
   SELECT * FROM tableB WHERE x IN(
       SELECT * FROM tableC WHERE user_id = y
   )
)

至关重要的是,最里面的语句从查看 user_id 并选择要在其余查询中使用的 id 编号列表开始。

我遇到的问题是,即使两个用户在 tableC 中有相同的数据,查询的其余部分似乎也没有被缓存。

例如,如果SELECT * FROM tableC WHERE user_id = 1返回 (1,2,3,4,5) 并且SELECT * FROM tableC WHERE user_id = 2还返回 (1,2,3,4,5)

如果我使用 user_id = 1 运行完整查询,则执行时间约为 0.007 秒。如果我重新运行查询,我会减少 0.002 的执行时间。如果我将 user_id 更改为 2 并运行查询,则执行时间会在第一次运行查询时回到 0.007。mySQL 是否可以缓存查询的各个部分的结果?

4

1 回答 1

0

看来你用的是mysql。因此,当您第一次运行查询 'SELECT * FROM tableC WHERE user_id = 1' 时,您会得到结果 '1,2,3,4,5' 并且查询会进入查询缓存。因此,第二次运行后的执行时间少于第一次。在这种情况下,您的结果与您的第一个查询相关联。当您运行第二个查询时,您的服务器对此一无所知。所以它运行它并返回一些东西(在你的情况下结果是相同的)。下次运行第二个查询时,您将从查询缓存中获取它,并且速度会非常快。无论如何,服务器将在查询缓存中存储两条不同的记录。

于 2013-07-20T14:23:14.513 回答