MySQL评测显示查询时间比PHP微时差慢


MySQL profiling shows slower query time than PHP microtime difference

我试图通过两种方式来衡量特定MySQL查询的速度。

在MySQL 中

SET profiling = 1;
QUERY;
SHOW PROFILES;

在PHP 中

$time = microtime(true);
Database::instance()->query(...);
$time = microtime(true) - $time;

SHOW PROFILES显示的时间约为0.009秒(持续时间)。$time显示的时间约为0.001s。

我很困惑,因为我本来以为PHP的度量比MySQL的度量慢。这没有任何意义。有人能解释一下吗?

编辑:我知道缓存,我已经用SQL_NO_CACHE尝试过了,但似乎没有什么不同。不过,我注意到的是,当我重新启动MySQL服务器时,最初的几次评测尝试与PHP报告的内容一致。但当我再进行几次分析时,持续时间突然增加:

1   0.00137900  SELECT COUNT(*) AS count ↵ 
2   0.00138800  SELECT COUNT(*) AS count ↵
3   0.00912700  SELECT COUNT(*) AS count ↵
4   0.00907300  SELECT COUNT(*) AS count ↵
5   0.00878900  SELECT COUNT(*) AS count ↵ 
6   0.00984200  SELECT SQL_NO_CACHE COUNT(*) AS count ↵
7   0.00895200  SELECT SQL_NO_CACHE COUNT(*) AS count ↵ 

细分大约需要0.009秒的查询,时间上的跳跃似乎来自于创建一个tmp表。但前两次它这样做真的很快(1和2)。基于PHP microtime(),它也非常快。之后探查器的某些东西减慢了速度?

starting    0.000055
checking permissions    0.000004
Opening tables  0.000013
System lock 0.000050
optimizing  0.000010
statistics  0.000041
preparing   0.000012
Creating tmp table  0.007696
executing   0.000014
Copying to tmp table    0.000317
Sorting result  0.000031
Sending data    0.000007
removing tmp table  0.000423
Sending data    0.000008
init    0.000007
optimizing  0.000011
executing   0.000005
end 0.000003
query end   0.000011
closing tables  0.000002
removing tmp table  0.000004

关闭表0.000006释放项目0.000054日志慢速查询0.000002清理0.000003

这是因为查询在SQL脚本执行后会被缓存。

因此,SQL脚本第一次运行查询。结果被缓存。然后执行PHP脚本。查询已缓存,因此检索结果的速度更快。


(奥利·琼斯)

在测量性能时,请尝试在查询中包含SQL_NO_CACHE选项。

E。g.

SELECT SQL_NO_CACHE COUNT(*), SUM(col)
  FROM table

@Ollie Jones

但甚至在硬盘I/O级别上也有缓存,它独立于MySQL的缓存。

-ktm

查询缓存像ktm5124所说的那样应用,但配置文件必须在操作系统上执行一些其他操作,这通常也会减慢查询速度。

您可以使用SQL_NO_CACHE参数对此进行测试,并在没有探查器的情况下比较php和mysql的结果。