【问题标题】:Performance - order by in MySQL or in PHP性能 - 在 MySQL 或 PHP 中排序
【发布时间】: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


【解决方案1】:

一般来说,您希望在数据库服务器上而不是在应用程序中进行排序。一个很好的理由是数据库应该实现并行排序并且它可以访问索引。一般规则可能不适用于所有情况。

我想知道您的索引是否对您有所帮助。我建议您尝试查询:

  1. 没有索引
  2. 仅在campaign_id 上有索引
  3. 同时使用两个索引

索引并不总是有用的。一个特别重要的因素称为“选择性”。如果表中只有两个活动,那么最好进行全表扫描,而不是间接搜索索引。这是因为当表不适合内存时尤其重要(导致每行都需要将页面加载到缓存中)。

最后,如果这将是一个超出您的单一服务器的应用程序,请小心。在单台机器上最优的东西在不同的环境中可能不是最优的。

【讨论】:

  • 嗯.. 很好地回答了有几千个活动并且还在增长。然而,这个特定的活动几乎有一半的数据与之相关。一旦需要多台服务器来平衡负载,我们就会立即切换到 memcached。
猜你喜欢
  • 2018-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 2023-03-22
  • 2022-11-11
  • 2021-12-10
  • 2014-02-25
相关资源
最近更新 更多