php - 构建高效的 PHP/MySQL 程序时应遵循哪些经验法则?

标签 php mysql performance

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

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

最佳答案

散列

了解您的哈希值(数组/表格/有序映射/无论您如何调用它们)。哈希查找非常快,有时,如果你有 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

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

  • explain [query]:一个显而易见的问题,很多人都弄错了。了解指数。您可以遵循一些规则,可以对其进行基准测试,并且可以产生巨大的影响。如果您真的想要这一切,请了解不同类型的索引(btree、哈希...)以及何时使用它们。

缓存

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

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

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

  • 输出缓存:存储您生成的 html 供以后使用(而不是每次都重新生成)。这可以带来最大的加速,但在某种程度上不利于 PHP 的动态特性。

  • 浏览器缓存:etags 和http 响应怎么样?如果操作得当,您可以一开始就避免大部分工作!大多数 php 程序员忽略此选项,因为他们不知道 HTTP 是什么。

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

有时没有缓存是不可能的,例如如果涉及到缩略图。调整图像大小非常昂贵,但幸运的是易于控制(大多数情况下)。

分析器

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

循环查询

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

inexperienced developers do have a primal, insatiable urge to write frameworks and content management systems

施纳勒定律

关于php - 构建高效的 PHP/MySQL 程序时应遵循哪些经验法则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/996208/

相关文章:

php - Laravel重写不起作用

mysql - 当在 mysql 中插入或更新行时,索引到底会发生什么?

MYSQL 内连接和派生表

c# - 通过将 UI 分解为 'regions' 来提高 WPF 性能 - 这可能吗?

performance - 时间复杂度 - 计算算法的最坏情况

javascript - 如何正确回显 onclick ='function($var)'

php - 不会从数据库中获取数据

python - 从系列词典中提取系列

php 数据未处理,有人可以查看我的代码吗?

c# - MySqlDataReader: DataTable.Fill(reader) 抛出 ConstraintException