mysql_data_seek与将数据存储在阵列中


mysql_data_seek versus storing data in array

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

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

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

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

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

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

非常感谢您的时间。

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

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

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

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

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

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

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

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