Py学习  »  DATABASE

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

Ben • 6 年前 • 1772 次点击  

几分钟前,我问,在登录时一次执行许多查询,并在会话中保存数据,还是根据需要进行查询,是更好的选择。我对答案感到惊讶,(根据需要提问)。在构建提高性能的php/mysql多用户应用程序时,还有其他好的经验法则需要遵循吗?

我正在寻找创建尽可能高效的应用程序的具体方法。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/30741
 
1772 次点击  
文章 [ 3 ]  |  最新文章 6 年前
Jonas Elfström
Reply   •   1 楼
Jonas Elfström    16 年前
  1. 隐藏物。
  2. 隐藏物。
  3. 快速索引查询。
Robert K
Reply   •   2 楼
Robert K    16 年前

优化MySQL查询 第一 ,然后是处理它的PHP,最后缓存大型查询和搜索的结果。到目前为止,MySQL是应用程序中最常见的瓶颈。一个设计糟糕的查询可能要比一个只选择所需信息的设计良好的查询长两到三倍。

因此,如果您的查询被优化 之前 你缓存了它们,节省了大量的处理时间。

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

stefs
Reply   •   3 楼
stefs    16 年前

哈希

了解您的哈希(数组/表/有序映射/无论您如何称呼它们)。哈希查找速度非常快,有时,如果您有O(n^2)循环,您可以先将它们组织成一个数组(由主键键控),然后再对它们进行处理,从而将它们减少到O(n)。

一个例子:

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

  • Myq.L.CONF: 我不知道通过优化MySQL配置而不是保留默认配置,您可以获得多少性能。但是我已经读过了,您可以忽略使用默认配置的每个PostgreSQL基准。配置的afaik与MySQL关系不大,但是为什么忽略它呢?经验法则:尝试将整个数据库放入内存中:)

  • 解释[查询]: 很明显,很多人都错了。了解索引。有一些规则你可以遵循,你可以基准它,你可以做出巨大的改变。如果你真的想要全部,了解不同类型的索引(btrees,hashes,…)以及何时使用它们。

高速缓存

缓存很难,但如果做得好,它会 这个 差异(不) 差异)。在我看来:如果你不需要缓存就可以生活,那就不要这样做。它常常会增加许多复杂性和故障点。Google曾经做过一次代理缓存(为了加快进程),有些人看到了其他人的私人信息。

在PHP中,人们经常使用4种不同的缓存:

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

  • 输出缓存: 存储生成的HTML以供以后使用(而不是每次都重新生成)。这可能导致最大的速度提高,但有点违背了PHP的动态特性。

  • 浏览器缓存: ETags和HTTP响应如何?如果做得好,你可能会避开大部分工作 就在开始的时候 !大多数PHP程序员忽略了这个选项,因为他们不知道HTTP是什么。

  • 操作码缓存: APC、Zend优化器等。使PHP代码加载更快。可以帮助处理大型应用程序。不过,与外部数据源无关(速度较慢),而且其潜力有点有限。

有时,没有缓存是不可能生存的,例如,如果涉及到缩略图。调整图像大小是非常昂贵的,但很容易控制(大多数时间)。

剖面仪

xdebug 显示应用程序的瓶颈。如果你的应用程序太慢,知道原因会很有帮助。

循环中的查询

有(php-)专家 不知道联接是什么 (对于你所教的每一个人,两个没有这些知识的新的将浮出水面——他们将编写框架,见施纳勒斯定律)。有时,循环中的查询并不那么明显,例如,如果它们与库一起提供。对查询进行计数-如果它们随着显示的结果而增长,则会出现问题。

缺乏经验的开发人员确实有一种原始的、永不满足的冲动来编写框架和内容管理系统。

施纳尔定律