【发布时间】:2013-05-16 14:52:30
【问题描述】:
我知道至少在这个线程中已经有人问过这个问题: is php sort better than mysql "order by"?
但是,我仍然不确定这里的选择是否正确,因为在 PHP 端进行排序的性能几乎快 40 倍。 这个 MySQL 查询运行大约 350-400 毫秒
SELECT
keywords as id,
SUM(impressions) as impressions,
SUM(clicks) as clicks,
SUM(conversions) as conversions,
SUM(not_ctr) as not_ctr,
SUM(revenue) as revenue,
SUM(cost) as cost
FROM visits WHERE campaign_id = 104 GROUP BY keywords(it's an integer) DESC
Keywords 和campaign_id 列已编入索引。
使用大约 150k 行,总共返回大约 1500 行。 然后重新计算结果(我们计算点击率、转化率、投资回报率等,以及整个结果集的总数)。计算是在 PHP 中完成的。
现在我的想法是使用 PHP APC 存储结果以便快速检索,但是我们需要能够按列以及计算值对这些结果进行排序,因此如果我想按点击率排序,我必须使用
查询中的(SUM(clicks) / (SUM(impressions) - SUM(not_ctr)) 使其慢了大约 40 毫秒,而最初的 400 毫秒已经很长了。
此外,我们对这些结果进行分页,但添加 LIMIT 0,200 并不会真正影响性能。
在测试 APC 方法时,我执行了查询,进行了额外的计算并将数组存储在内存中,因此它只会在初始请求期间执行一次,而且效果很好。从内存中获取和排序数组只需要大约 10 毫秒,但脚本内存使用量约为 25mb。也许值得将结果加载到内存表中,然后直接查询该表?
这一切都是在我的本地机器(i7,8gb ram)上完成的,它安装了默认的 MySQL,生产服务器是 Rackspace 上的一个 512MB 盒子,我还没有测试过,所以如果可能的话,请忽略服务器设置。
所以真正的问题是:是否值得使用内存表,还是应该只使用 PHP 排序并忽略 RAM 使用,因为我总是可以升级 RAM?在优化性能时,您还会考虑哪些其他选项?
【问题讨论】:
-
您可能需要考虑将查询分解为子查询Documentation 我相信这将允许您首先检索数据,然后对其进行一些求和和排序。总体思路是将您的查询分解成运行速度更快的小块。
-
如果它在 PHP 中更快,并且您确定无法加快查询速度...这就是您的答案,不是吗?其实,问题是什么?
-
现有的 MySQL 设置适用于 10-12 年的 PC。如果您还没有尝试过,请尝试不同的配置(设置更多内存、CPU 到不同的设置)和 INNODB 存储引擎。
-
是的,忘了提,这些表使用的是 InnoDb。
标签: php mysql performance caching apc