Mysql присоединение к таблице занимает слишком много времени, в то время как простой выбор результатов быстро - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть таблица InnoDB daily_sales_msr.

Когда я запускаю запрос из этой таблицы без объединения, запрос быстро возвращает результат.

Но если я присоединяюсь к этому столу даже с небольшим столом, то это занимает слишком много времени. Каково решение этой проблемы?

Например:

SELECT
sku.ssku,
ROUND(SUM(daily_sales_msr.sale), 3) AS sale,
MONTHNAME(daily_sales_msr.date) AS `month`
FROM
daily_sales_msr
INNER JOIN sku ON sku.id = daily_sales_msr.skid
WHERE
daily_sales_msr.date BETWEEN '2018-08-01'
AND '2018-08-08'
GROUP BY
daily_sales_msr.skid

Этот запрос занимает более 1000 с.

Без какого-либо присоединения это займет всего 0,15 с.

1 Ответ

0 голосов
/ 02 сентября 2018

для производительности убедитесь, что у вас есть правильный индекс
в вашем случае вы можете использовать составной индекс на

table daily_sales_msr for  columns  (skid,date) 

и для SQL вы используете group by, но некоторые столбцы в select, а не в group, не связаны с функцией агрегирования это в большинстве db engine e в mysql, начиная с формы 5.7, notb alloged по умолчанию. результат для этих столбцов непредсказуем поэтому вы должны добавить эти столбцы в группу по

SELECT
  sku.ssku,
  ROUND(SUM(daily_sales_msr.sale), 3) AS sale,
  MONTHNAME(daily_sales_msr.date) AS `month`
FROM  daily_sales_msr
INNER JOIN sku ON sku.id = daily_sales_msr.skid
WHERE  daily_sales_msr.date BETWEEN '2018-08-01'  AND '2018-08-08'
GROUP BY  daily_sales_msr.skid, month 

или используйте функцию агрегирования также для этих столбцов

SELECT
  sku.ssku,
  ROUND(SUM(daily_sales_msr.sale), 3) AS sale,
  MAX(MONTHNAME(daily_sales_msr.date)) AS `month`
FROM  daily_sales_msr
INNER JOIN sku ON sku.id = daily_sales_msr.skid
WHERE  daily_sales_msr.date BETWEEN '2018-08-01'  AND '2018-08-08'
GROUP BY  daily_sales_msr.skid
...