У меня есть этот запрос:Mysql - Помощь для оптимизации запроса
SELECT bi.id,
bi.location,
bi.expense_group,
bi.level,
bi.is_active,
bi.type,
full_name,
(bl.bud_amount) AS BudgetAmount,
(COALESCE(((bl.bud_amount * 3) - (
+ bal.bal_amount1 + bal.bal_amount2
+ bal.bal_amount3)), 0)) AS Difference,
(COALESCE(Round((+ bal.bal_amount1 + bal.bal_amount2
+ bal.bal_amount3)/3), 0)) AS Average,
bal.bal_amount1 AS BAL1,
bal.bal_amount2 AS BAL2,
bal.bal_amount3 AS BAL3
FROM (SELECT *
FROM budget_items bi
WHERE bi.location IS NOT NULL) AS bi
LEFT JOIN (SELECT budget_item_id,
Sum(CASE
WHEN budget_id = 21491 THEN amount
END) AS bud_amount
FROM budget_lines
GROUP BY budget_item_id) AS bl
ON bl.budget_item_id = bi.id
JOIN (SELECT budget_item_id,
Ifnull(Sum(CASE
WHEN balance_id = 12841 THEN amount
END), 0) AS bal_amount1,
Ifnull(Sum(CASE
WHEN balance_id = 18647 THEN amount
END), 0) AS bal_amount2,
Ifnull(Sum(CASE
WHEN balance_id = 18674 THEN amount
END), 0) AS bal_amount3
FROM balance_lines
GROUP BY budget_item_id) AS bal
ON bal.budget_item_id = bi.id
ORDER BY bi.location
Это занимает много времени. В таблицах budget_lines и balance_lines у меня более 5 000 000 строк в каждом.
Я также прилагаю EXPLAIN запроса, так что вы не сможете увидеть проблему. Все идентификаторы в каждой таблице индексируются. Есть ли какой-либо столбец, который, если бы был проиндексирован, вызвал запрос? Или, может быть, мне нужно изменить его.
*** LEFT JOIN необходимо, потому что мне нужно получить все элементы из nudget_items, даже если они не существуют в таблице balance/budget_line.
Схема: каждый бюджет имеет свои бюджетные рамки. У каждого баланса есть свои балансы. Запрос нацелен на то, чтобы таблица ОДНО суммировала различия между бюджетом и несколькими балансами.
Вы можете увидеть больше изображений здесь: http://i.stack.imgur.com/dlF8V.png
EDIT: После @Sebas ответов:
Для @sabes голода, я ставлю здесь описательную: budget_items
budget_lines
balance_lines
_I также приложить EXPLAIN запроса ..._ (вы сделали?) – xQbert
Просто сделал. Благодарю. –
Ваши таблицы 'bal' и' bl', по-видимому, только суммируют значения для некоторого 'balance_id'. Вы должны добавить его в предложение where своих соответствующих подзапросов. – Sebas