MySQL 是否缓存查询?

19 mysql

我正在使用PHP 数据对象(PDO)连接 MySQL 数据库并执行大量 SQL 查询。通常,大约需要 1500 毫秒;我还需要优化它。当我两次运行 PHP 脚本时,间隔很短,查询只需要大约 90 毫秒。查询在两种情况下都是相同的。当我使用相同的查询运行脚本时,又过了一段时间,又需要 1500 毫秒。

这是为什么?数据库会自动缓存吗?是否有一段时间数据库保存缓存然后自动删除它?

我假设结果不能被 PHP 缓存,因为这发生在两个不同的线程中。我不认为 PHP 会缓存结果,因为它不知道数据库是否已更改。

我每分钟运行一个脚本来向数据库插入新行。这也可能是一段时间后又需要 1500 ms 的原因;缓存将被删除,因为相关表不再相同。

Bra*_*vic 15

这很可能是MySQL Query Cache 的产物

您执行 SQL 查询,MySQL 会缓存其结果,如果速度很快,则下次执行。当您运行脚本以在查询引用的表中插入数据时,结果缓存将失效,并且下次必须“真正”执行查询。

从上面链接的 MySQL 文档中:

与频繁的 INSERT 语句导致缓存中的结果持续无效的混合相比,几乎完全由一组固定的 SELECT 语句组成的查询组合更有可能从启用缓存中受益。


小智 6

是的,mySQL(与所有其他流行的数据库产品一样)缓存对其进行的查询。

缓存非常聪明——即使查询的确切参数不同,它也经常可以使用缓存进行查询。这会对性能产生很大的影响。

缓存完全由数据库服务器软件控制;您无法看到缓存包含的内容,也无法查看给定项目在缓存中保留多长时间;它可以在任何给定时刻被覆盖,具体取决于正在调用的其他查询等。它有助于提高性能,但不应该依赖它来提高性能。

你可以在 MySQL 手册中阅读更多关于它的信息

此外,使用 PDO 允许您将查询编写为“准备好的语句”,绑定参数而不是将它们硬编码为纯文本查询字符串。这也对数据库服务器和重复查询有缓存影响,也将提高性能。

  • “即使查询的确切参数不同,它通常也可以使用缓存进行查询”是完全不正确的。查询必须与先前执行且仍在缓存的查询逐字节相同,以便从缓存中提供服务。甚至`SELECT *` 和`select *` 之间的差异也意味着不会从缓存中提供其他相同的查询。http://dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html。发布 5.1 链接以保持一致性,但适用于所有版本。 (3认同)
  • “从 MySQL 5.1.17 开始,在第 8.6.3.1 节,“查询缓存如何操作”中描述的条件下,查询缓存用于准备好的语句。在 5.1.17 之前,查询缓存不用于准备好的语句。” http://dev.mysql.com/doc/refman/5.1/en/query-cache.html (2认同)