3

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

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

  • 车辆类型
  • 制作
  • 价格范围
  • 新/二手

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

查询一:

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...

有没有办法在一个查询中做到这一点?它更快吗?

4

3 回答 3

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的东西。

于 2012-07-16T18:09:04.520 回答
1

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

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

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

于 2012-07-16T18:09:19.080 回答
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

要找到更快的位置,您应该进行自己的速度测试。这帮助我发现我的一些查询在不加入它们的情况下更快。

于 2012-07-16T18:12:08.180 回答