【问题标题】:PHP MYSQL refine search multiple queriesPHP MYSQL 细化搜索多个查询
【发布时间】:2014-02-17 05:42:17
【问题描述】:

我目前正在为汽车经销商建立一个网站。我想允许用户细化类似于 amazon 或 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...

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

【问题讨论】:

    标签: php mysql search count


    【解决方案1】:

    您的查询似乎是合理的。

    您可以使用 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 之类的东西。

    【讨论】:

    • 我要去看看memcache,我想看很久了。经销商进行了一些大型促销活动,并一次让数百有时数千人在线。只是想确保它最初是正确构建的
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      使用 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

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

      【讨论】:

        猜你喜欢
        • 2018-04-19
        • 2014-11-29
        • 2012-11-12
        • 2011-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多