草庐IT

php - mysqli_fetch_assoc()性能PHP5.4与PHP7.0

coder 2023-06-10 原文

我有一个大型的MySQL查询(180万行,25列),我需要从中进行二维数组(基于主键的内存表)。

代码可以按预期工作,但是$ table的创建在PHP7.0中花费很长时间。

PHP7.0表现这么差的原因是什么?我的主要兴趣是mysqli

感谢您的任何见解-如果我可以修复性能,PHP7将为我节省很多内存。

mysqli代码段

$start = microtime(true);

$vysledek = cluster::query("SELECT * FROM `table` WHERE 1");
$query_time = (microtime(true) - $start);
$start_fetch = microtime(true);
while($zaznam = mysqli_fetch_assoc ( $vysledek )){
  $fetch_time+= (microtime(true) - $start_fetch);
  $start_assign = microtime(true);
  $table[$zaznam['prikey']] = $zaznam;
  $assign_time+= (microtime(true) - $start_assign);
  $start_fetch = microtime(true);
}
$total_time+= (microtime(true) - $start);
echo round($assign_time, 2).' seconds to set the array values\n';
echo round($query_time, 2).' seconds to execute the query\n';
echo round($fetch_time, 2).' seconds to fetch data\n';
echo round($total_time, 2).' seconds to execute whole script\n';
echo "Peak Memory Usage:".round(memory_get_peak_usage(true)/(1024 * 1024), 2)." MB\n";

mysqli结果

Deb 7 PHP 5.4 mysqlnd 5.0.10
1.8秒设置数组值
8.37秒执行查询
13.49秒以获取数据
24.42秒执行整个脚本
峰值内存使用:8426.75 MB

Deb 8 PHP 5.6 mysqlnd 5.0.11-dev
1.7秒设置数组值
8.58秒执行查询
12.55秒以获取数据
23.6秒执行整个脚本
峰值内存使用:8426.75 MB

Deb 8 PHP 7.0 mysqlnd 5.0.12-dev
0.73秒设置数组值
8.63秒执行查询
126.71秒来获取数据
136.46秒执行整个脚本

峰值内存使用量:7394.27 MB

Deb 8 PHP 7.0 mysqlnd 5.0.12-dev扩展基准测试

我扩展了节获取的基准测试,以每10万行报告以下结果:

线在1.87秒内获取了100000条
线在5.24秒内获得了300000
线在10.97s内获取了500000条
线在19.17秒内获得了700000
线在29.96秒钟内获得了900000
线以43.03s的价格售出1100000
线在58.48秒内获得了1300000
线在76.47秒内获得了1500000
线在96.73秒内获得了1700000
线在107.78秒钟内卖出了1800000

DEB8 PHP7.1.0-dev libclient 5.5.50

1.56秒设置数组值
8.38秒执行查询
456.52秒来获取数据
467.68秒执行整个脚本

峰值内存使用量:8916 MB

DEB8 PHP7.1.0-dev libclient 5.5.50扩展基准测试

线在2.72秒内获取了100000条
线在15.7秒内获得了300000
线在38.7秒内获取了500000条
线在71.69秒钟内获得了700000
线在114.8s内获得了900000
线在168.18秒内获得了1100000
线在231.69秒钟内卖出了1300000
线在305.36秒内获取了1500000
线在389.05秒内卖出了1700000
线在434.71秒内获取了1800000

DEB8 PHP7.1.0-dev mysqlnd 5.0.12-dev

1.51秒设置数组值
9.16秒执行查询
261.72秒来获取数据
273.61秒执行整个脚本

峰值内存使用:8984.27 MB

DEB8 PHP7.1.0-dev mysqlnd 5.0.12-dev扩展基准测试

线在3.3秒内获取了100000条
线在13.63秒内获得了300000
线在29.02s中获取了500000条
线在49.21秒内获得了700000
线在74.56秒钟内获得了900,000欧元
线在104.97秒内获取了1100000
线在140.03秒内获得了1300000
线在180.42秒内获取了1500000
线在225.72秒内获取了1700000
线在250.01秒内获得了1800000

PDO代码片段
$start = microtime(true);
$sql = "SELECT * FROM `table` WHERE 1";
$vysledek = $dbh->query($sql, PDO::FETCH_ASSOC);
$query_time = (microtime(true) - $start);
$start_fetch = microtime(true);
foreach($vysledek as $zaznam){
  $fetch_time+= (microtime(true) - $start_fetch);
  $start_assign = microtime(true);
  $table[$zaznam['prikey']] = $zaznam;
  $assign_time+= (microtime(true) - $start_assign);
  $start_fetch = microtime(true);
}
$total_time+= (microtime(true) - $start);
echo round($assign_time, 2).' seconds to set the array values\n';
echo round($query_time, 2).' seconds to execute the query\n';
echo round($fetch_time, 2).' seconds to fetch data\n';
echo round($total_time, 2).' seconds to execute whole script\n';
echo "Peak Memory Usage:".round(memory_get_peak_usage(true)/(1024 * 1024), 2)." MB\n";

PDO结果

Deb 7 PHP 5.4 mysqlnd 5.0.10
设置数组值的1.85秒
12.51秒执行查询
16.75秒以获取数据
31.82秒执行整个脚本
峰值内存使用量:11417.5 MB

Deb 8 PHP 5.6 mysqlnd 5.0.11-dev
1.75秒设置数组值
12.16秒执行查询
15.72秒以获取数据
30.39秒执行整个脚本
峰值内存使用量:11417.75 MB

Deb 8 PHP 7.0 mysqlnd 5.0.12-dev
0.71秒设置数组值
35.93秒执行查询
114.16秒以获取数据
151.19秒执行整个脚本

峰值内存使用:6620.29 MB

基准比较代码
 $start_query = microtime(true);
 exec("mysql --user=foo --host=1.2.3.4 --password=bar -e'SELECT * FROM `profile`.`table`' > /tmp/out.csv");
 $query_time = (microtime(true) - $start_query);
 echo round($query_time, 2).' seconds to execute the query \n';

对于所有系统,执行时间在19秒+ -1秒变化时都是相似的。

基于以上观察,我想说PHP 5.X是合理的,因为执行的工作比仅仅转储到文件还要多。
  • 所有3个服务器都在同一主机上(源服务器和两个测试服务器)
  • 重复时
  • 测试保持一致
  • 内存中已经有类似的变量,我需要将其删除以进行比较以进行测试,与
  • 问题无关
  • CPU始终处于100%的状态
  • 两台服务器均具有32G RAM,并且swappiness设置为1,目标是将其作为内存操作执行
  • 测试服务器专用,没有其他可运行的
  • php.ini在主要版本之间进行了更改,但是与mysqli/PDO相关的所有选项似乎都是相同的
  • Deb8机器降级到PHP5.6,重新安装PHP7后,问题消失了。
  • 报告了php.net-ID 72736的错误,因为我相信已经证明问题出在PHP中,而不是系统或任何其他配置中

    编辑1 :添加了PDO比较

    编辑2 :添加了基准测试标记,编辑了PDO结果,因为存在基准测试错误

    编辑3 :原始问题中的主要清理工作,重建代码段以更好地指示错误

    编辑4 :添加了有关PHP降级和升级的要点

    编辑5 :为DEB8 PHP7.0添加了扩展的基准测试

    编辑6 :包含php7配置

    编辑7 :带有两个库的PHP 7.1开发人员的性能测量-使用Bishop的配置编译,删除了我的php-config

    编辑8 :添加了与CLI命令的比较,较小的清理工作

  • 最佳答案

    供交叉引用:随着 PHP 7.1的发布于2016年12月1日发布,此问题应得到解决(在PHP 7.1中)。

    PHP 7.0 :即使在票据中已写明PHP-7.0已被修补,但在最近的更改日志(7.0.13 on 10 Nov 2016,自补丁加入日期起)中,我还没有看到这是当前PHP 7.0.x的一部分释放。也许在下一个版本中。

    到上游(由于OP的报告),对该错误进行了跟踪:Bug #72736 - Slow performance when fetching large dataset with mysqli / PDO(bugs.php.net; 2016年8月)。

    关于php - mysqli_fetch_assoc()性能PHP5.4与PHP7.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38614982/

    有关php - mysqli_fetch_assoc()性能PHP5.4与PHP7.0的更多相关文章

    1. Ruby 的数字方法性能 - 2

      我正在使用Ruby解决一些ProjectEuler问题,特别是这里我要讨论的问题25(Fibonacci数列中包含1000位数字的第一项的索引是多少?)。起初,我使用的是Ruby2.2.3,我将问题编码为:number=3a=1b=2whileb.to_s.length但后来我发现2.4.2版本有一个名为digits的方法,这正是我需要的。我转换为代码:whileb.digits.length当我比较这两种方法时,digits慢得多。时间./025/problem025.rb0.13s用户0.02s系统80%cpu0.190总计./025/problem025.rb2.19s用户0.0

    2. ruby - Ruby 性能中的计时器 - 2

      我正在寻找一个用ruby​​演示计时器的在线示例,并发现了下面的代码。它按预期工作,但这个简单的程序使用30Mo内存(如Windows任务管理器中所示)和太多CPU有意义吗?非常感谢deftime_blockstart_time=Time.nowThread.new{yield}Time.now-start_timeenddefrepeat_every(seconds)whiletruedotime_spent=time_block{yield}#Tohandle-vesleepinteravalsleep(seconds-time_spent)iftime_spent

    3. ruby-on-rails - 如果条件与 &&,是否有任何性能提升 - 2

      如果用户是所有者,我有一个条件来检查说删除和文章。delete_articleifuser.owner?另一种方式是user.owner?&&delete_article选择它有什么好处还是它只是一种写作风格 最佳答案 性能不太可能成为该声明的问题。第一个要好得多-它更容易阅读。您future的自己和其他将开始编写代码的人会为此感谢您。 关于ruby-on-rails-如果条件与&&,是否有任何性能提升,我们在StackOverflow上找到一个类似的问题:

    4. ruby - 如何找到我的 Ruby 应用程序中的性能瓶颈? - 2

      我编写了一个Ruby应用程序,它可以解析来自不同格式html、xml和csv文件的源中的大量数据。我如何找出代码的哪些区域花费的时间最长?有没有关于如何提高Ruby应用程序性能的好资源?或者您是否有任何始终遵循的性能编码标准?例如,你总是用加入你的字符串吗?output=String.newoutput或者你会使用output="#{part_one}#{part_two}\n" 最佳答案 好吧,有一些众所周知的做法,例如字符串连接比“#{value}”慢得多,但是为了找出您的脚本在哪里消耗了大部分时间或比所需时间更多,您需要进行分

    5. STM32的HAL和LL库区别和性能对比 - 2

      LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L

    6. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

      按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

    7. ruby - GC.disable 的任何性能缺点? - 2

      是否存在GC.disable会降低性能的情况?只要我使用的是真正的RAM而不是交换内存,就可以这样做吗?我正在使用MRIRuby2.0,据我所知,它是64位的,并且使用的是64位的Ubuntu:ruby2.0.0p0(2013-02-24revision39474)[x86_64-linux]Linux[redacted]3.2.0-43-generic#68-UbuntuSMPWedMay1503:33:33UTC2013x86_64x86_64x86_64GNU/Linux 最佳答案 GC.disable将禁用垃圾回收。像rub

    8. ruby-on-rails - Rails with angular 与 Rails pure(查看性能) - 2

      我尝试在Internet上搜索有关使用angularJS进入RubyonRails项目与RubyonRailspure的View性能的信息。我的问题是因为2个月前我开始使用纯AngularJS,现在我需要将AngularJS集成到一个新项目中,但需要展示使用带有RubyonRails的AngularJS呈现View的性能如何,并消除对RubyonRails的负担.例如:带Rails的Angular:使用RubyonRails获取数据(从数据库或GET请求),将信息发送到file.js.erb并使用AngularJS操作数据并显示带有解析数据的View。纯粹的Rails:(自然流程)使用

    9. ruby-on-rails - 在 Rails 3 应用程序中使用 require_dependency 对性能有何影响? - 2

      我觉得我理解require和require_dependency之间的区别(来自Howarerequire,require_dependencyandconstantsreloadingrelatedinRails?)。但是,我想知道如果我使用一些不同的方法(参见http://hemju.com/2010/09/22/rails-3-quicktip-autoload-lib-directory-including-all-subdirectories/和Bestwaytoloadmodule/classfromlibfolderinRails3?)来加载所有文件会发生什么,所以我们:

    10. arrays - Ruby 中的并行分配性能 - 2

      设置一个临时变量来交换数组中的两个元素似乎比使用并行赋值更有效。谁能帮忙解释下?require"benchmark"Benchmark.bmdo|b|b.reportdo40000000.times{array[1],array[2]=array[2],array[1]}endendBenchmark.bmdo|b|b.reportdo40000000.timesdot=array[1]array[1]=array[2]array[2]=tendendend结果:usersystemtotalreal4.4700000.0200004.490000(4.510368)usersyste

    随机推荐