什么是更快,一个大的连接查询与更多的PHP或多个小选择与较少的PHP?

Kor*_*lis 5 php mysql left-join database-performance

我正在运行一个cron任务,它会向MySQL服务器发出大量查询.最大的问题是服务器有时运行得非常慢.

我有一个相对较大的查询,其中4个表连接在它们之间,4个较小的查询与natural joins也攻击第一个表.抛出这些查询后,我会处理结果并使用它们进行分组PHP.

我计划的是以某种方式将这5个查询混合到一个大查询中,然后在我需要时PHP快速做一些sort().

我也被告知MySQL查询运行速度比PHP过滤和排序要快,但在谈论有7或8个左连接时,我有理由担心它.有关这些查询的更多规范(由于公司政策,我无法复制):

  • 每个获取的行和字段将至少访问一次.
  • 每个查询都基于单个主表运行,并带有一些"翼"表.
  • 每个查询都使用相同的GROUP BY规则.
  • 目前,PHP代码将一些辅助查询结果拆分为多个数组.如果使用大查询,它也应该按多个参数对结果进行排序.

所以,由于这些问题,也许作为一个经验法则:

什么是更快,一个大的连接查询与更多的PHP或多个小选择与较少的PHP?

Kic*_*art 9

根据经验,查询越少越好.将查询传递给MySQL有一个开销,但查询很复杂.然而,对于某些事情来说,php的速度非常快,如果你没有使用索引进行排序(如果你有效地将几个查询的结果排在一起,这听起来很可能),那么php中某种类型的性能可能具有可比性,甚至更好.

存在很大差异的地方是,您获取一个查询的结果,然后对第一个查询中的每个返回行执行另一个查询.在这种情况下很容易让查询的数量在没有被注意的情况下迅速失控.在工作中,我找到了一个菜单生成脚本,它有一个查询来获取高级菜单项,然后是每个高级项的另一个查询来获取子菜单项.这很容易被重写为连接,但令人惊讶的部分是性能差异,生成菜单所需的时间从0.2秒减少到0.002秒.

但这是一个案例决定.我需要根据levenshtein计算值返回一些值(基本上是不同2个字符串的得分).使用mysql自定义函数这是可能的,并大大减少了返回的行数,但速度很慢.PHP的莱文斯坦功能是大量更快,它被证明是更有效的返回几倍多行,然后处理它们在PHP中得到莱文斯坦值,然后删除不再需要的记录.

在你描述的情况下,我怀疑差异可能是微不足道的.看起来你只会做4个查询而不是1个更复杂的查询.但是,如果没有看到表结构和查询(遗憾的是你无法提供),很难确定.执行单个合理的复杂查询可能效率很高,但忽略不严格必要的排序,然后在php中执行(使用用户定义的比较的usort对此有用).

还有一个问题是复杂查询更难以维护.虽然有很多人可以将PHP脚本整合在一起或者能够理解简单的SQL查询,但是能够理解复杂SQL查询的人数却令人担忧.