0

我已经搜索了几个小时,但没有找到关于这个主题的任何内容。

我正在开发一个网站,该网站依赖于查询来定义必须在页面上加载的元素。但是为了组织数据,我必须重新传递这个查询的结果 4 次。

在第一次尝试时,我开始使用 mysql_data_seek 以便我可以重新传递查询,但我开始失去性能。因此,我尝试交换 mysql_data_seek 以将数据放入数组并运行 foreach 循环。

性能并没有以任何我可以衡量的方式提高,所以我开始想知道实际上哪个是最好的选择。通过多次执行 mysql_fetch_array 构建一个相当大的数据数组。

我的应用程序当前使用 PHP 5.2.17、MySQL 运行,一切都在本地主机中。不幸的是,我有一个繁忙的数据库,但与它的连接数从来没有任何问题。

有没有更好的方法来执行这个任务?除了 mysql_data_seek 或大数组数据之外,还有其他选择吗?有没有人提供一些关于这些选项的基准测试的信息?

非常感谢您的宝贵时间。

4

1 回答 1

1

您的问题的答案可能在于索引数据库中的适当字段,大多数数据库也缓存经常服务的查询,但是一旦它们经过的表被更改,它们往往会丢弃它们。(这是有道理的)

因此,您可以相信您的数据库能够做好它所擅长的事情:查询和检索数据,并通过确保表上几乎没有争用和/或放置适当的索引来帮助它。然而,这反过来可以改变写入的性能,这在您的情况下可能并不重要,只有您才能真正判断。(必须计算和保存索引)。

如果速度至关重要,您使用的 PHP 扩展也将发挥作用:“升级”到mysqlipdo并执行 -> fetch_all (),因为它会减少 php 进程和数据库服务器之间的通信。反对这种情况的唯一原因是,如果您查询的数据量如此之大,以至于它通过强制交换来停止或阻塞您的 php/webserver 进程甚至整个服务器。

您使用的表类型可能很重要,与 INNODB 相比,某些类型的查询似乎在 MISAM 上运行得更快。如果你想重新调整一下,那么你可以将这些数据(或它的副本)存储在 mysql 的HEAP 引擎中,所以只是在内存中。您需要小心地将其与写入时的磁盘表同步,但如果您想确定保留更改的数据。(以防服务器故障或关闭)

或者,您可以将数据缓存在memcache或使用apc_store 之类的东西中,这应该非常快,因为它位于 php 进程内存中。这里最大的警告是,APC通常可用于存储的内存较少。(默认为32MB) Memcache 的一大优势是虽然速度仍然很快,但它是分布式的,因此如果您有多个服务器运行,它们可以共享这些数据。

您可以尝试使用 nosql 数据库,最好是一个只是密钥库的数据库,甚至不是文档存储,例如redis

最后,您可以在 php 脚本中硬编码您的值,确保仍然使用eaccelerator或 APC 之类的东西,并验证您是否真的需要使用它们 4 次,或者您是否不能只缓存您实际创建的任何内容的输出用它。

所以很抱歉我不能给你一个现成的答案,但性能问题,如果适用,通常需要多管齐下的方法。:-|

于 2012-06-01T23:12:27.827 回答