MySQL分页结果,缓存还是nocache?

时间:2012-09-21 20:51:40

标签: mysql caching

使用MySQL,我有许多类似的查询:

SELECT * FROM table_name WHERE some_clause ORDER BY id LIMIT 1000 OFFSET 0
SELECT * FROM table_name WHERE some_clause ORDER BY id LIMIT 1000 OFFSET 1000
SELECT * FROM table_name WHERE some_clause ORDER BY id LIMIT 1000 OFFSET 2000
SELECT * FROM table_name WHERE some_clause ORDER BY id LIMIT 1000 OFFSET 3000

等等。关键是我通过结果集进行分页。每个偏移量只会执行一次,所以缓存它没有意义。但是,我最终将遍历所有结果。在这种情况下,我非常关心污染我们的查询缓存。

如果我添加SQL_NO_CACHE,这将导致MySQL停止缓存结果。这是最有效的,因为每个特定的结果集只会使用一次吗?或者MySQL是否足够智能,可以缓存整个结果集一次,根据每个请求的限制和偏移量来拉取子集?

换句话说,如果我不使用SQL_NO_CACHE,上面的四个示例SQL语句会导致一个查询和三个缓存的响应,还是会导致四个单独的未缓存查询?

1 个答案:

答案 0 :(得分:1)

根据MySQL's documentation on query caching,“如果稍后收到相同的语句,服务器将从查询缓存中检索结果,而不是再次解析和执行语句。”

具体来说,以下两个语句被认为是不同的,即使它们仅在大小写方面有所不同,因此不会被缓存:

SELECT * FROM tbl_name
Select * from tbl_name

因此,很明显,在我上面的问题中,添加SQL_NO_CACHE是正确的做法,因为MySQL的查询缓存在这里没用。