我有一个包含许多嵌套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是否可以缓存查询各个部分的结果?
答案 0 :(得分:0)
看来你使用的是mysql。因此,当您第一次获得结果'1,2,3,4,5'时,运行查询'SELECT * FROM tableC WHERE user_id = 1',您查询将转到查询缓存。因此,第二次运行后的执行时间小于第一次运行。在这种情况下,您的结果与您的第一个查询相关联。 当您运行第二个查询时,您的服务器对此一无所知。所以它运行它并返回一些东西(在你的情况下结果是相同的)。下次运行第二个查询时,您将从查询缓存中获取它,并且速度非常快。无论如何,服务器将在查询缓存中存储两个不同的记录。