在构建高效的PHP / MySQL程序时,要遵循哪些经验法则?

时间:2009-06-15 13:46:54

标签: php mysql performance

几分钟前,我问过在登录时一次执行多个查询是否更好,并将数据保存在会话中,或根据需要进行查询。我对答案感到惊讶,(根据需要查询)。在构建加速性能的PHP / MySQL多用户应用程序时,还有其他好的经验法则吗?

我正在寻找创建最有效应用程序的具体方法。

3 个答案:

答案 0 :(得分:11)

散列

知道你的哈希(数组/表格/有序地图/无论你怎么称呼它们)。哈希查找速度非常快,有时候,如果你有O(n ^ 2)个循环,你可以先将它们组织成一个数组(用主键键入)然后再处理它们,将它们减少到O(n)。 p>

一个例子:

foreach ($results as $result)
  if (in_array($result->id, $other_results)
     $found++;

很慢 - in_array遍历整个$other_result,导致O(n ^ 2)。

foreach ($other_results as $other_result)
  $hash[$other_result->id] = true;

foreach ($results as $result)
  if (isset($hash[$result->id]))
    $found++;

第二个更快(取决于结果集 - 越大,越快),因为isset()是(几乎)恒定的时间。实际上,这不是一个很好的例子 - 你可以使用内置的php函数更快地做到这一点,但你明白了。

优化(我的)SQL

  • mysql.conf:我不知道通过优化mysql配置而不是保留默认值可以获得多少性能。但我已经读过你可以忽略每个使用默认配置的postgresql基准测试。与配置相关的afaik与mysql相比较少,但为什么要忽略它呢?经验法则:尝试将整个数据库放入内存中:)

  • 解释[查询]:一个显而易见的问题,很多人都错了。了解指数。你可以遵循规则,你可以对它进行基准测试,你可以做出巨大的改变。如果你真的想要这一切,请了解不同类型的指数(btree,哈希,...)以及何时使用它们。

缓存

缓存很难,但如果做得好,则会产生 差异(而不是 差异)。在我看来:如果你可以在没有缓存的情况下生活,那就不要这样做。它往往会增加很多复杂性和失败点。 google做了一次代理缓存(使intertubes更快),有些人看到了其他人的私人信息。

在PHP中,有4种不同类型的缓存人员经常使用:

  • 查询缓存:几乎总是转换为memcached(有时转换为APC共享内存)。将特定查询的结果集存储到快速键/值(=哈希)存储引擎。查询(现在查找)变得非常便宜。

  • 输出缓存:存储生成的html供以后使用(而不是每次都重新生成)。这可以带来最大的加速,但有点对付PHP的动态性。

  • 浏览器缓存: etags和http响应怎么样?如果做得好,你可以在开头正确地避免大部分工作!大多数php程序员都忽略了这个选项,因为他们不知道HTTP是什么。

  • 操作码缓存: APC,zend优化器等。使PHP代码加载更快。可以帮助大型应用程序。与(慢)外部数据源无关,但潜力有限。

有时候,没有缓存就无法生存,例如如果是缩略图。图像大小调整非常昂贵,但fortunatley易于控制(大部分时间)。

分析器

xdebug向您展示了应用程序的瓶颈。如果您的应用太慢,了解原因会很有帮助。

循环查询

有(php-)专家不知道什么是连接(对于你教育的每一个人,没有那些知识的两个新人将会浮出水面 - 他们将编写框架,参见schnalles法)。有时,那些循环查询并不那么明显,例如如果他们带有图书馆。对查询进行计数 - 如果它们随着显示的结果而增长,则会出现问题。

  没有经验的开发人员确实有编写框架和内容管理系统的原始,永不满足的冲动

schnalle的法律

答案 1 :(得分:6)

优化您的MySQL查询首先,然后是处理它的PHP,然后最后缓存大型查询和搜索的结果。到目前为止,MySQL是应用程序中最常见的瓶颈。设计不良的查询可能比仅选择所需信息的精心设计的查询长两到三倍。

因此,如果您的查询在 之前进行了优化,则可以缓存它们,从而节省了大量的处理时间。

但是,在某些共享主机上,由于缺少Memcached,缓存只是文件系统。在这种情况下,运行较小的查询可能比缓存它们更好,因为当您的站点负载时,硬盘驱动器的查找时间(以及等待其他站点的访问)可能比查询时间更长。

答案 2 :(得分:4)

  1. 高速缓存。
  2. 高速缓存。
  3. 快速索引查询。