У меня есть запрос MySQL, как показано ниже, который необходимо запустить в 3 разных базах данных (db1, db2 и db3) и запросить 2 таблицы, которые точно такие же в трех базах данных: sales_order_item и sales_order_item
(
SELECT
COUNT(DISTINCT soi.fk_sales_order) AS total_sales
FROM
db1.sales_order_item soi
left join db1.sales_order_item_status sois
ON soi.fk_sales_order_item_status = sois.id_sales_order_item_status
WHERE
sois.name NOT IN ('invalid', 'test_invalid', 'new', 'placed', 'exchange_return_pending', 'exportable')
AND DATE(date_add(created_at, INTERVAL 04 HOUR)) = DATE(date_add(CURRENT_TIMESTAMP, INTERVAL 04 HOUR))
)
Я выполняю вышеуказанный запрос, используя объединить все для трех разных баз данных, как уже упоминалось.
Проблема в том, что каждая из таблиц содержит данные в диапазоне от 40 до 80 миллионов строк, а выполнение вышеуказанного запроса занимает около 1,5 часов.
Я не уверен, есть ли способ дальнейшей оптимизации вышеуказанного запроса, даже если все столбцы, которые используются в запросе, проиндексированы.
Любая помощь будет принята с благодарностью.






Выполнение
left joinвернет все строки таблицыdb1.sales_order_item_status. В результате вы получите отчетливое количество в таблицеdb1.sales_order_item_status, отфильтрованное с учетом заданных вами условийwhere. Это то, что вам нужно?