为什么 MySQL 在我们的动态 PHP 站点上缓存数据?

use*_*867 5 mysql cache

我们对我们的 PHP/MySQL 站点感到烦恼,因为它似乎从数据库缓存数据,而我们的 PHP 页面显示过时的记录。事实上,有些页面链接到已从数据库中完全删除的 URL,但它们不显示更新的记录,甚至不显示丢失的数据。

如果我们有耐心等待几个(未定义)小时,数据最终会显示出来。我已经通过 PHP 在所有页面上添加了常规的无缓存标头,但它似乎不会影响 MySQL 输出。

网站的 PHP 部分可以立即更新,并立即显示 HTML 等更改。有没有办法强制 MySQL 只从其查询中提取新数据?我认为这就是它的工作方式!

谢谢,克里斯

PS这是我用来尝试强制无缓存情况的php代码:

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // Always modified
header("Cache-Control: private, no-store, no-cache, must-revalidate"); // HTTP/1.1 
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache"); // HTTP/1.0
Run Code Online (Sandbox Code Playgroud)

Ric*_*mes 7

MySQL所做的任何事情都不会导致陈旧数据——不是查询缓存,不是SQL_CACHE,不是key_buffer,不是buffer_pool。问题必须在 MySQL 之外。


Rol*_*DBA 2

您可以执行SELECT SQL_NO_CACHE。mysqldump 使用它来始终将新数据转储到文本文件。如果选择的表是 InnoDB,这也可能有助于刷新 innodb 缓冲池。

如果您无法操作 SELECT 语句,请将query_cache_type 设置为 0。这将使所有 SELECT 的行为类似于 SELECT SQL_NO_CACHE。您可以在不重新启动 mysql 的情况下执行此操作:

步骤 1) 将其添加到 /etc/my.cnf

[mysqld]
query_cache_type=0
Run Code Online (Sandbox Code Playgroud)

步骤2)在mysql客户端中运行它

SET GLOBAL query_cache_type = 0;
Run Code Online (Sandbox Code Playgroud)

最后的话

这样做可能会增加读取 I/O。您可能还需要考虑设置 innodb_max_dirty_pages_pct = 0 以使 innodb 缓冲池保持尽可能完全刷新到磁盘的最新数据。

步骤 1) 将其添加到 /etc/my.cnf

[mysqld]
query_cache_type=0
innodb_max_dirty_pages_pct=0
Run Code Online (Sandbox Code Playgroud)

步骤2)在mysql客户端中运行它

SET GLOBAL query_cache_type = 0;
SET GLOBAL innodb_max_dirty_pages_pct = 0;
Run Code Online (Sandbox Code Playgroud)

更新 2011-05-20 11:17

从 PHP 的角度来看,所有数据库连接可能都已超时。

看看重启 MySQL 和 apache 是否可以。

另外,请确保 MySQL、PHP 和 Apache 的超时值全部匹配

另外,执行此操作

netstat | grep [m3][y3][s0][q6] | grep TIME_WAIT
Run Code Online (Sandbox Code Playgroud)

这有助于查看操作系统是否尚未释放任何失效的数据库连接