0

使用 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 语句会导致一个查询和三个缓存响应,还是会导致四个单独的未缓存查询?

4

1 回答 1

1

根据MySQL 关于查询缓存的文档,“如果稍后收到相同的语句,服务器会从查询缓存中检索结果,而不是再次解析和执行该语句。”

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

SELECT * FROM tbl_name
Select * from tbl_name

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

于 2012-09-25T18:05:48.510 回答