- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
几分钟前,我问是在登录时一次执行多个查询并将数据保存在 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 函数更快地完成此操作,但您明白了。
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/
我是一名优秀的程序员,十分优秀!