【问题标题】:MYSQL order by + group by... fastest way?MYSQL order by + group by...最快的方式?
【发布时间】:2017-03-21 08:20:40
【问题描述】:

我正在尝试优化 SQL 查询,我希望获得一些专家意见,了解将 GROUP BY 和 ORDER BY 结合起来的最佳/最快方式

基本上我试图从产品表中选择最低价格并按商家名称分组。

这是我最初的查询:

select p.*, m.*, d.* from datafeeds as d, products as p left outer join meta as m on p.mykey = m.mykey where p.datafeed_id = d.id and (match(p.name) against ('+asics +"gel" -women*' in boolean mode)) and p.datafeed_id = '35' and p.is_custom = 0 group by d.merchant_name order by d.merchant_name limit 50

ORDER BY 不起作用,我得到的是分组产品,但不是价格最低的产品。

在阅读了其他讨论后,我想出了一个改进的查询:

SELECT p . * , m . * , d . * 
FROM datafeeds AS d, products AS p
INNER JOIN (

SELECT MIN( display_price ) AS MinPrice
FROM products AS p
WHERE 1 =1
AND (

MATCH (
p.name
)
AGAINST (
'+asics +"gel" -women*'
IN BOOLEAN
MODE
)
)
AND p.datafeed_id =  '35'
AND p.is_custom =0
GROUP BY merchant_name
) AS p2 ON p.display_price = p2.MinPrice
LEFT OUTER JOIN meta AS m ON p.mykey = m.mykey
WHERE p.datafeed_id = d.id
AND (

MATCH (
p.name
)
AGAINST (
'+asics +"gel" -women*'
IN BOOLEAN
MODE
)
)
AND p.datafeed_id =  '35'
AND p.is_custom =0
GROUP BY d.merchant_name
ORDER BY d.merchant_name
LIMIT 50`

查询得到正确的结果,但速度很慢。 有更好的方法吗?

提前致谢

【问题讨论】:

    标签: mysql group-by sql-order-by inner-join


    【解决方案1】:

    你可以试试这个

    SELECT          p.*, 
                    m.*, 
                    d.* 
    FROM            datafeeds AS d, 
                    ( 
                             SELECT   * 
                             FROM     products 
                             WHERE    1 = 1 
                             AND      ( 
                                               MATCH ( name ) against ( '+asics +"gel" -women*' IN boolean mode ) ) 
                             AND      datafeed_id = '35' 
                             AND      is_custom =0 
                             ORDER BY merchant_name, 
                                      display_price) AS p 
    LEFT OUTER JOIN meta                             AS m 
    ON              p.mykey = m.mykey 
    WHERE           p.datafeed_id = d.id 
    GROUP BY        d.merchant_name 
    ORDER BY        d.merchant_name 
    LIMIT           50
    

    【讨论】:

    • 谢谢Trung...速度差不多但是SQL看起来干净了很多
    • 表产品有多少条记录?如果只执行子查询别名为p - (....) AS p,是快还是慢?
    • 大约 300.000 条记录...您的查询需要 0.0536 秒才能运行...而我在 0.0593 以上发布的查询
    • 您可以尝试执行此查询“SELECT * FROM products GROUP BY Merchant_name ORDER BY Merchant_name LIMIT 50”吗?需要多长时间?
    • 查询耗时 1.5772 秒
    猜你喜欢
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 2012-05-06
    • 2021-02-22
    • 1970-01-01
    相关资源
    最近更新 更多