PHP MYSQL优化搜索多个查询

时间:2012-07-16 18:00:05

标签: php mysql search count

我目前正在为汽车经销商建立一个网站。我想允许用户优化类似于亚马逊或ebay的搜索结果。通过点击缩小结果范围的能力会很棒。问题是我这样做的方式现在有很多不同的查询需要完成,每个查询总共有COUNT个。

因此缩小结果的主要方法是:

  • 车型
  • 价格范围
  • 新/旧

目前,我每次加载此页面时都会执行5次查询,以便在传递设定值时获取结果数。

查询1:

SELECT vehicle_type, COUNT(*) AS total FROM inventory
[[ Already Selected Search Parameters]]
GROUP BY vehicle_type
ORDER BY vehicle_type ASC

查询2:

SELECT make, COUNT(*) AS total FROM inventory
[[ Already Selected Search Parameters]]
GROUP BY make
ORDER BY make ASC

查询3,4,5 ...

有没有办法在一个查询中执行此操作?它更快吗?

3 个答案:

答案 0 :(得分:2)

您的查询似乎合理。

您可以使用UNION ALL

在单个查询中执行此操作
SELECT 'vehicle_type' AS query_type, vehicle_type, COUNT(*) AS total
FROM inventory
...
GROUP BY vehicle_type

UNION ALL

SELECT 'make', make, COUNT(*) AS total FROM inventory ... GROUP BY make

UNION ALL

SELECT ... etc ...

这对性能的好处不会很大。

如果您发现这些查询很多并且结果不会经常更改,您可能需要考虑缓存结果。考虑使用类似memcache的内容。

答案 1 :(得分:1)

有几种方法可以按照数据仓库的方式对数据进行排名,但是您尝试在搜索术语中完成的操作称为facets。一个真正的搜索引擎(将与您提到的网站一起使用)执行此操作。

许多网站使用Lucene(基于Java)搜索引擎和SOLR来完成您所指的内容。有一个名为ElasticSearch的新解决方案,它具有RESTful API并提供方面,但您需要安装Java,ES,然后才能调用返回本机JSON的搜索引擎。

在MySQL中执行它而不需要这么多连接可能需要额外的表和可能需要触发器并且变得复杂。如果汽车经销商不期望Cars.com流量(数百万/天),那么您可能会尝试在实际需要之前优化某些东西。您的递归查询可能足够快,并且您没有报告存在实际问题或瓶颈。

答案 2 :(得分:1)

使用JOIN语法: http://dev.mysql.com/doc/refman/5.6/en/join.html

或者,我认为你可以为此编写MySQL函数。您将在哪里传递搜索参数。 http://dev.mysql.com/doc/refman/5.1/en/create-function.html

要找到更快的地方,您应该进行自己的速度测试。这有助于我在没有加入的情况下更快地发现我的一些查询。