MySQL -强制不使用缓存来测试查询速度

我正在测试MySQL中一些查询的速度。数据库正在缓存这些查询,这使得我在测试这些查询有多快时很难得到可靠的结果。

是否有方法禁用查询的缓存?

系统:MySQL 4在Linux主机上,我可以访问PHPMyAdmin。

谢谢

226411 次浏览
尝试在查询中使用SQL_NO_CACHE (MySQL 5.7)选项。 (MySQL 5.6用户点击在这里)

如。

SELECT SQL_NO_CACHE * FROM TABLE

这将停止MySQL缓存结果,但是请注意,其他操作系统和磁盘缓存也可能影响性能。这些都很难绕过。

您也可以运行以下命令来重置查询缓存。

RESET QUERY CACHE

如果你想禁用查询缓存,在你的mysql配置文件中设置query_cache_size为0。如果设置为0,mysql将不使用查询缓存。

有一个问题

SELECT SQL_NO_CACHE * FROM TABLE

方法的缺点是,它似乎只会阻止查询的结果被缓存。但是,如果您正在查询一个正在与您想要测试的查询一起使用的数据库,那么其他客户机可能会缓存您的查询,从而影响您的结果。我正在继续研究解决这个问题的方法,如果我找到了一个,我会编辑这篇文章。

还有一个配置选项:query_cache_size=0

要在服务器启动时禁用查询缓存,请将系统变量query_cache_size设置为0。通过禁用查询缓存代码,不会产生明显的开销。如果从源代码构建MySQL,则可以通过使用——without-query-cache选项调用configure,将查询缓存功能完全排除在服务器之外。

看到http://dev.mysql.com/doc/refman/5.1/en/query-cache.html

任何对当前日期/时间的引用都会禁用该选择的查询缓存:

SELECT *,NOW() FROM TABLE

参见“MySQL查询缓存使用的先决条件和注意事项”@ http://dev.mysql.com/tech-resources/articles/mysql-query-cache.html

另一个只影响当前连接的选项:

SET SESSION query_cache_type=0;

在查询中使用用户定义的变量会使查询结果不可缓存。我发现它是一个比使用SQL_NO_CACHE更好的指示器。但是你应该把变量放在一个变量设置不会严重影响性能的地方:

SELECT t.*
FROM thetable t, (SELECT @a:=NULL) as init;

我会使用以下方法:

SHOW VARIABLES LIKE 'query_cache_type';
SET SESSION query_cache_type = OFF;
SHOW VARIABLES LIKE 'query_cache_type';

虽然有些答案是好的,但有一个重要的警告。

mysql查询可能被阻止被缓存,但它不会阻止你的底层os缓存磁盘访问内存。对于某些查询来说,这可能是一个严重的放缓,特别是当它们需要从旋转的磁盘中提取数据时。

因此,虽然使用上述方法很好,但每次我也会尝试使用不同的数据集/范围进行测试,这些数据可能不会从磁盘拉到磁盘/内存缓存中。

你必须修改SQL字符串。因为SQL字符串是一个缓存键。 例如,为SQL注释添加时间戳

PHP函数:

function db_RunSQL($SQL, $NoCacheMode=false)
{
$SQL = (($NoCacheMode) ? '/*'.time().'*/ ' : '') . $SQL;
return mysqli_query(db_SavedConnect(), $SQL);
}