使用 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 语句会产生一个查询和三个缓存响应,还是会产生四个单独的未缓存查询?
最佳答案
根据MySQL's documentation on query caching ,“如果稍后收到相同的语句,服务器会从查询缓存中检索结果,而不是再次解析并执行该语句。”
具体来说,以下两个语句被认为是不同的,即使它们仅在大小写上不同,因此不会被缓存:
SELECT * FROM tbl_name
Select * from tbl_name
因此,很明显,在我上面的问题中,添加 SQL_NO_CACHE 是正确的做法,因为 MySQL 的查询缓存在这里毫无用处。
关于MySQL分页结果,缓存还是不缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12538005/