是用PHP还是MySQL来完成繁重的工作呢?


Is it better to have PHP or MySQL do the heavy lifting?

我花了很长时间用PHP为我的站点构建这个自定义搜索函数,它根据最终用户提供的选项和输入增量地构建MySQL查询。它在我的本地服务器上工作得很好,但是当我把它上传到生产站点时,它运行得很慢。我对PHP和MySQL编程比较陌生,所以我对一般和未来的项目很好奇:

当运行一个搜索查询,是更好的有一个复杂的,精确的MySQL查询,过滤数据,并返回结果PHP显示,或运行一个简单的MySQL查询,从数据库中获得一堆数据,并让PHP过滤数据,然后显示结果?

这是一种平衡行为。以下是我的建议:

  • 使用FULLTEXT使字符串搜索更快。
  • 在WHERE子句中排序字段,首先索引列,然后是数字,然后是日期,然后是文本字段。这将通过在便宜的列之后过滤昂贵的列来减少您的负载,减少数据库必须做的工作量。在处理大型数据集时避免ORDER,并将此处理卸载到PHP代码中,因为它将节省MySQL在查询中每个点的数据排序。
  • 索引最常用或最昂贵的搜索字段。
  • 当您可以轻松地执行两个或更多查询时,不要使用大量的join。在一些大型表上进行10或20个join的查询可以完全杀死您的数据库。
  • UNION用于在同一表上一次执行几个SELECT查询,而不是使用OR执行复杂的逻辑。

一般来说,最优查询应该足够了。在某些极端情况下,使用PHP来完成工作是有用的,但是数据库对于99%的情况应该足够快。

如果数据库被许多web服务器访问,那么对MySQL服务器进行大量处理可能不是一个好主意。其次,如果你使用的查询会产生大量的数据,这将花费你的数据传输到web服务器很长时间,你将不得不在php中做更多的处理。

另一方面,MySQL使用了大量的优化,因此它可以有效地获取数据。

所以这完全取决于你在做什么

我认为你可以把它们结合起来以获得最佳效果。首先,根据精确匹配或非常接近的匹配运行查询。基本上,如果有人搜索页面的确切名称,您只需要返回(=而不是LIKE)。然后,如果他们把第一部分做对了(比如"words%")。最后,用MySQL来构建一个更复杂的数据库。当用户提供最好的数据时,这确保了最快的回报。

在优化web应用程序时,有几个变量会起作用。根据你所说的,允许用户选择几个选项来"构建一个查询",这让我相信你可能在做一些代价高昂的MySQL操作。你想远离or,如果你需要做任何ORDER BY,你可以在应用层通过填充结果数组然后对数组排序来完成。

你可能还想考虑在MySQL层之上添加一个缓存层,这样你就不必每次都访问数据库了。

正如Kerrek在他的评论中提到的,你可以分析你的应用程序,看看瓶颈在哪里,查看XDebug (http://xdebug.org/)和KCacheGrind (http://kcachegrind.sourceforge.net/html/Home.html)

只是一些想法让你开始。