繁体   English   中英

MySQL 查询在子查询中使用 JOINS 太慢

[英]MySQL query too slow with JOINS in sub query

我有一个包含“products”和链接“products_prices”表的数据库。 我正在尝试获取符合特定条件集的所有“产品”的平均“产品价格”。 诀窍是我不需要特定日期的平均价格,而是查询分组所依据的日期之前和包括当天所有价格的总平均价格。 我可能没有很好地解释它。

例如,如果我在第一天以 100 美元的价格列出了 2 个产品,那么结果的第一行将显示当天的 'totalCount' = 2 和 'totalSum'= 200 美元。 如果在第 2 天添加另一个价格为 150 美元,那么现在结果中有 2 行,第二行显示 'totalCount' = 3 和 'totalSum' = 350 美元。

因此,查询应该将所有符合条件的记录的计数添加到它自己的日期之前。

那有意义吗 ?

我有一个查询似乎可以满足我的要求,但速度非常慢。 我很确定这是因为我在子查询中使用了 JOINS。

SELECT pp.created_at,

    (SELECT COUNT(products_prices.id) FROM products_prices 
        INNER JOIN products ON products_prices.product_id = products.id 
        WHERE products_prices.created_at <= pp.created_at
       AND products.make LIKE '%Beneteau%'  
       AND length_feet >= 47
       AND length_feet <= 52
       AND products_prices.marked_as_sold <> 1
       ) AS totalCount,

    (SELECT SUM(products_prices.price) FROM products_prices
       INNER JOIN products ON products_prices.product_id = products.id 
       WHERE products_prices.created_at <= pp.created_at
       AND products.make LIKE '%Beneteau%'
       AND length_feet >= 47
       AND length_feet <= 52
       AND products_prices.marked_as_sold <> 1
       ) AS totalSum

FROM products_prices pp
GROUP BY DAY(pp.created_at) 
ORDER BY created_at

以下是此查询产生的结果...

created_at  totalCount  totalSum
2018-11-29 00:00:00 0   
2018-11-30 00:00:00 0   
2018-12-01 09:58:14 0   
2018-12-02 04:58:13 0   
2018-12-03 13:15:14 0   
2018-12-04 04:45:12 0   
2018-12-05 01:15:13 0   
2018-12-06 10:15:13 0   
2018-12-07 11:26:41 0   
2018-12-08 00:00:13 2   504000
2018-12-09 01:05:07 2   504000
2018-12-10 01:05:08 2   504000
2018-12-11 00:45:12 2   504000
2018-12-12 01:00:14 2   504000
2018-12-13 01:05:08 2   504000
2018-12-14 01:18:10 2   504000
2018-12-15 00:02:13 2   504000
2018-12-16 00:45:12 2   504000
2018-12-17 00:02:13 2   504000
2018-12-18 01:05:08 2   504000
2018-12-19 00:02:14 11  2535500
2018-12-20 01:05:08 12  2724500
2018-12-21 00:02:14 13  2973500
2018-12-22 00:20:30 13  2973500
2018-12-23 01:15:06 13  2973500
2018-12-24 01:11:09 13  2973500
2018-12-25 01:28:07 13  2973500
2018-12-26 01:25:06 13  2973500
2018-12-27 00:02:09 13  2973500
2018-12-28 00:02:11 13  2973500

必须有更好的方法来做到这一点。 任何人有任何想法?

最新的建议是这个...

SELECT pp.created_at                 ,
COUNT(pp.id) totalCount,
SUM(pp.price) totalSum
FROM products_prices pp
INNER JOIN products 
ON pp.product_id = products.id
GROUP BY DAY(pp.created_at)
HAVING pp.created_at <= pp.created_at
AND  products.make LIKE '%Beneteau%'
AND  length_feet >= 47
AND  length_feet <= 52
AND  pp.marked_as_sold <> 1
ORDER BY created_at;

但它会在“具有条款”中抛出“未知列“产品.make””

当然 - 在子查询中使用连接很慢

但是 MySQL 支持 DESCRIBE

我怀疑你需要创建一些索引

LIKE 是一个非常缓慢的语句 - 并且在索引中非常困难

也许开始:

SELECT id from products WHERE make LIKE '%Beneteau%';

把它储存起来然后使用:

AND product_id IN ([the id's you stored])

然后在product_id、length_feet 和marked_as_sold 上创建一些索引

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM