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