[英]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.