MySQL上的查询缓存是否会在一段时间后自动重置?有些结果会缓存一段时间,但第二天就会重置

MySQL上的查询缓存是否会在一段时间后自动重置?有些结果会缓存一段时间,但第二天就会重置,mysql,sql,amazon-web-services,amazon-rds,Mysql,Sql,Amazon Web Services,Amazon Rds,我执行如下查询: SELECT * FROM graphql.cases where parties = 'Bondelmonte v Bondelmonte' LIMIT 0, 1000 需要2秒钟。然后我重复了一遍,花了0.2秒,告诉我缓存正在工作 但第二天,我重复同样的事情,再次重复,开始需要2秒,然后是0.2秒 我不是一天前第一次缓存了查询吗?有多种情况可能会导致查询结果从缓存中清除,例如: 数据可能已被修改 您可能运行的语句的文本与缓存的语句略有不同(小写/大写,换行符,…)

我执行如下查询:

SELECT * 
FROM graphql.cases 
where parties = 'Bondelmonte v Bondelmonte' 
LIMIT 0, 1000
需要2秒钟。然后我重复了一遍,花了0.2秒,告诉我缓存正在工作

但第二天,我重复同样的事情,再次重复,开始需要2秒,然后是0.2秒


我不是一天前第一次缓存了查询吗?

有多种情况可能会导致查询结果从缓存中清除,例如:

  • 数据可能已被修改
  • 您可能运行的语句的文本与缓存的语句略有不同(小写/大写,换行符,…)
  • 缓存可能已达到其大小限制之一(内存、查询计数、块等),并决定退出特定查询
  • 缓存碎片变得很高,甚至在某些内存仍然可用的情况下,也强制缓存修剪查询
  • 等等
一句话:即使进行了适当的微调,查询也不会永远保持缓存状态;有时,MySQL需要重新执行查询并再次缓存它,这就是您看到的

以下几句话供您参考:

查询必须完全相同(逐字节),才能被视为相同。此外,由于其他原因,相同的查询字符串可能会被视为不同。使用不同数据库、不同协议版本或不同默认字符集的查询被视为不同的查询,并单独缓存

[……]

如果表发生更改,则使用该表的所有缓存查询都将无效并从缓存中删除。这包括使用映射到已更改表的
MERGE
表的查询。表可以通过多种类型的语句进行更改,例如
INSERT
UPDATE
DELETE
TRUNCATE table
ALTER table
DROP table
,或
DROP DATABASE

[……]

如果有很多查询的结果很小,那么默认块大小可能会导致内存碎片,如大量空闲块所示。由于内存不足,碎片可能会强制查询缓存从缓存中删除查询


有多种情况可能会导致查询结果从缓存中清除,例如:

  • 数据可能已被修改
  • 您可能运行的语句的文本与缓存的语句略有不同(小写/大写,换行符,…)
  • 缓存可能已达到其大小限制之一(内存、查询计数、块等),并决定退出特定查询
  • 缓存碎片变得很高,甚至在某些内存仍然可用的情况下,也强制缓存修剪查询
  • 等等
一句话:即使进行了适当的微调,查询也不会永远保持缓存状态;有时,MySQL需要重新执行查询并再次缓存它,这就是您看到的

以下几句话供您参考:

查询必须完全相同(逐字节),才能被视为相同。此外,由于其他原因,相同的查询字符串可能会被视为不同。使用不同数据库、不同协议版本或不同默认字符集的查询被视为不同的查询,并单独缓存

[……]

如果表发生更改,则使用该表的所有缓存查询都将无效并从缓存中删除。这包括使用映射到已更改表的
MERGE
表的查询。表可以通过多种类型的语句进行更改,例如
INSERT
UPDATE
DELETE
TRUNCATE table
ALTER table
DROP table
,或
DROP DATABASE

[……]

如果有很多查询的结果很小,那么默认块大小可能会导致内存碎片,如大量空闲块所示。由于内存不足,碎片可能会强制查询缓存从缓存中删除查询