如何使用图像服务脚本优化MySQL查询?

时间:2012-05-02 18:41:57

标签: php mysql sql apache

我在PHP中有一个图像服务脚本,我一直在优化。我已经在优化的服务器端工作了很多,但我也想确保我优化mysql方面的东西。我目前在每次加载此图像服务脚本时都使用MYSQL执行以下操作。

  1. 连接数据库
  2. 检查提供的ID是否有效,如果
  3. 则返回该行
  4. 通过将匹配数列增加1来更新图像的统计数据
  5. 使用特定控制器增加stats表,并将操作增加1
  6. 我没有关闭连接,我被告知让它坐下来,因为它花费的时间更少而且它会自己死掉
  7. 我在我的服务器上运行了“mysqladmin status”,发现此刻有63.8997 avg正在运行。我目前有大约17个req / s通过apache加载这个脚本。我还在服务器上配置了eaccelerator,以保持此脚本的编译版本可供使用。我的问题是,有什么方法可以进一步优化我可以处理的查询数量?我试图确保尽可能保持所有#​​s尽可能低的速度并尽可能快地移动?

    我的目标是让我的服务器处理432万个图像,每天都没有问题(在apache中为50 / req一秒)。

2 个答案:

答案 0 :(得分:1)

每次增加计数器并将其提交给数据库时,您可能会写入磁盘。相反,您可以尝试将内存中的命中数缓存几分钟,并且每隔几分钟就将缓存转储回数据库。这将减少您在数据库上的写入和读取次数。

您还可以更进一步缓存内存中的整行。只有在数据不经常变化且数据经常被请求的情况下,这才是实用的。此外,如果您开始缓存大量数据,内存约束可能会成为一个问题。

我知道在一些非常高性能的数据库环境中,整个数据库实例将存储在内存中,并且只会定期写入磁盘。这也将大大减少查询时间,并减少缓存的需要,因为一切都已经在内存中。但这需要一些严肃的硬件。

此外,您可能希望最终离开MySQL。 MySQL并不是高性能的最佳选择,即因为MySQL和存储过程并不是很好。存储过程在数据库上编译,并且不需要解析SQL以便执行。如果您要切换到某些东西,例如Oracle,那么整个事务可以使用编译的存储过程完成。如果有的话,MySQL并不容易提供这种灵活性。

答案 1 :(得分:0)

您应该拥有多个副本读取服务器,并使用它来提供数据,以及一个只执行以下操作的统计服务器:

INSERT DELAYED INTO stats (image) VALUES (:image);

这将为您提供水平可伸缩的读取服务和快速统计计数器。

或者以图像形式(有些东西效果):

enter image description here