我正在运行一个cron任务,它向MySQL
服务器发出大量查询。最大的问题是服务器有时运行得非常慢。
我有一个相对较大的查询,其中4个表连接在它们之间,4个较小的查询natural join
s也攻击第一个表。抛出这些查询后,我会处理结果并使用PHP
对其进行分组。
我计划的是以某种方式将这5个查询混合到一个大查询中,然后让我PHP
在需要时快速sort()
。
我还被告知MySQL
查询在过滤和排序方面的运行速度比PHP
快,但在谈论有7个或8个左连接时,我有理由担心它。有关这些查询的更多规范(由于公司政策,我无法复制):
GROUP BY
规则。PHP
代码将一些辅助查询结果拆分为多个数组。如果使用大查询,它也应该按多个参数对结果进行排序。所以,由于这些问题,也许可以作为一个经验法则:
什么是更快,一个大型连接查询,包含更多PHP或多个小选择,少用PHP?
答案 0 :(得分:8)
根据经验,查询越少越好。将查询传递给MySQL有一个开销,但查询很复杂。然而,对于某些事情来说,php的速度非常快,如果你没有使用索引进行排序(如果你有效地将几个查询的结果排在一起,这听起来很可能),那么php中的排序性能可能具有可比性甚至更好
存在很大差异的地方是您获得一个查询的结果,然后对第一个查询中的每个返回行执行另一个查询。在这种情况下很容易让查询的数量在没有被注意的情况下迅速失控。在工作中,我发现了一个菜单生成脚本,它有一个查询来获取高级菜单项,然后是每个高级项的另一个查询来获取子菜单项。这很容易被重写为连接,但令人惊讶的部分是性能差异,生成菜单所需的时间从0.2秒减少到0.002秒。
但这是一个案例决定。我需要根据levenshtein计算值返回一些值(基本上是不同2个字符串的得分)。使用mysql自定义函数这是可能的,并大大减少了返回的行数,但速度很慢。 php levenshtein函数的速度要快得多,事实证明,返回几倍的行会更有效,然后在php中处理它们以获得levenshtein值,然后删除不再需要的记录。
在你描述的情况下,我怀疑差异可能是微不足道的。看起来你只会做4个查询而不是1个更复杂的查询。但是,如果没有看到表结构和查询(遗憾的是你无法提供),很难确定。执行单个合理的复杂查询但忽略非严格必要的排序可能效率很高,然后在php中执行(使用用户定义的比较的usort对此有用)。
还有一个问题是复杂查询更难维护。虽然有很多人可以将PHP脚本整合在一起,或者可以理解一个简单的SQL查询,但是能够理解复杂SQL查询的人数却非常小。
答案 1 :(得分:0)
根据我的经验,SQL查询更快。我在一些应用程序中也使用了很多表,发现在PHP中使用简单查询和收集数据集的速度较慢,如果将所有内容放在SQL端,性能会得到很大提升。