MySQL запрос слишком медленный с JOINS в подзапросе - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть база данных, в которой есть таблицы «products» и связанные таблицы «products_prices».Я пытаюсь получить среднее значение «products_prices.price» для всех «продуктов», которые соответствуют определенному набору критериев.Хитрость заключается в том, что мне не нужна средняя цена в конкретный день, а совокупная средняя цена для всех цен до и включая день, когда запрос группируется.Я, наверное, не очень хорошо это объясняю.

Например, если бы в первый день я перечислил 2 продукта по 100 долларов, то в строке одного из результатов было бы показано 'totalCount' = 2 и 'totalSum' = 200 долларов.на этот день.Если бы в день 2 была добавлена ​​другая цена, равная 150 долл., В результатах теперь было бы 2 строки, во 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;

, но он выбрасывает "Неизвестный столбец" products.make "в" имеющее предложение "*

1 Ответ

0 голосов
/ 29 декабря 2018

Конечно - использование объединений в подзапросе медленное

Но MySQL поддерживает DESCRIBE

Я подозреваю, что вам нужно создать несколько индексов

LIKE - очень медленный оператор - и довольнотрудно в индексах

Может быть, начать с:

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

Сохраните это, затем используйте:

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

Затем создайте некоторый индекс для product_id, length_feet и marks_as_sold

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...