我在PHP中有一个图像服务脚本,我一直在优化。我已经在优化的服务器端工作了很多,但我也想确保我优化mysql方面的东西。我目前在每次加载此图像服务脚本时都使用MYSQL执行以下操作。
我在我的服务器上运行了“mysqladmin status”,发现此刻有63.8997 avg正在运行。我目前有大约17个req / s通过apache加载这个脚本。我还在服务器上配置了eaccelerator,以保持此脚本的编译版本可供使用。我的问题是,有什么方法可以进一步优化我可以处理的查询数量?我试图确保尽可能保持所有#s尽可能低的速度并尽可能快地移动?
我的目标是让我的服务器处理432万个图像,每天都没有问题(在apache中为50 / req一秒)。
答案 0 :(得分:1)
每次增加计数器并将其提交给数据库时,您可能会写入磁盘。相反,您可以尝试将内存中的命中数缓存几分钟,并且每隔几分钟就将缓存转储回数据库。这将减少您在数据库上的写入和读取次数。
您还可以更进一步缓存内存中的整行。只有在数据不经常变化且数据经常被请求的情况下,这才是实用的。此外,如果您开始缓存大量数据,内存约束可能会成为一个问题。
我知道在一些非常高性能的数据库环境中,整个数据库实例将存储在内存中,并且只会定期写入磁盘。这也将大大减少查询时间,并减少缓存的需要,因为一切都已经在内存中。但这需要一些严肃的硬件。
此外,您可能希望最终离开MySQL。 MySQL并不是高性能的最佳选择,即因为MySQL和存储过程并不是很好。存储过程在数据库上编译,并且不需要解析SQL以便执行。如果您要切换到某些东西,例如Oracle,那么整个事务可以使用编译的存储过程完成。如果有的话,MySQL并不容易提供这种灵活性。
答案 1 :(得分:0)
您应该拥有多个副本读取服务器,并使用它来提供数据,以及一个只执行以下操作的统计服务器:
INSERT DELAYED INTO stats (image) VALUES (:image);
这将为您提供水平可伸缩的读取服务和快速统计计数器。
或者以图像形式(有些东西效果):