几分钟前,我问过在登录时一次执行多个查询是否更好,并将数据保存在会话中,或者根据需要进行查询.我对答案感到惊讶,(根据需要查询).在构建加速性能的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函数更快地做到这一点,但你明白了.
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法).有时,那些循环查询并不那么明显,例如,如果它们带有库.计算查询 - 如果它们随着显示的结果而增长,则会出现问题.
缺乏经验的开发人员确实有编写框架和内容管理系统的原始,永不满足的冲动
施纳尔定律
优化你的MySQL查询第一,然后处理它的PHP,然后最后缓存大型查询和搜索结果.到目前为止,MySQL是应用程序中最常见的瓶颈.设计不良的查询可能比仅选择所需信息的精心设计的查询长两到三倍.
因此,如果在缓存之前优化了查询,则可以节省大量处理时间.
但是,在某些共享主机上,由于缺少Memcached,缓存只是文件系统.在这种情况下,运行较小的查询可能比缓存它们更好,因为当您的站点负载时,硬盘驱动器的查找时间(以及等待其他站点的访问)可能比查询时间更长.