0

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

  1. 连接到数据库
  2. 检查提供的 id 是否有效,如果有效则返回该行
  3. 通过将点击数列增加 1 来更新图像的统计信息
  4. 将带有特定控制器和操作的统计表也增加 1
  5. 我没有关闭连接,我被告知让它静置,因为它需要更少的时间并且它会自行死亡

我在我的服务器上运行了“mysqladmin status”,发现目前正在运行 63.8997 avg。我目前有大约 17 个 req/s 通过 apache 加载此脚本。我还在服务器上配置了 eaccelerator,以保持该脚本的编译版本可供使用。我的问题是有什么方法可以进一步优化我可以处理的查询数量?我正在努力确保将所有#s 保持在尽可能低的水平并尽可能快地移动?

我的目标是让我的服务器每天处理 432 万张图片而没有问题(在 apache 中是每秒 50/req)。

4

2 回答 2

1

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

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

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

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

于 2012-05-02T19:09:02.900 回答
0

您应该有多个副本读取服务器并将其用于提供数据,以及一个仅执行以下操作的统计服务器:

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

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

或以图像形式(某种效果):

在此处输入图像描述

于 2012-05-02T18:54:18.997 回答