2015-03-19 4 views
0

У меня есть запрос MySQL, который последовательно занимает 7 секунд, чтобы закончить:Низкая производительность запросов в MySQL присоединиться к группе К

SELECT g.GroupID, g.GroupName, count(s.EventDate) AS Total 
FROM Groups g 
LEFT JOIN Schedule s 
ON g.GroupID = s.GroupID 
WHERE g.OrganizationID = 2 
AND g.IsActive = 1 
AND IFNULL(g.IsDeleted,0) = 0 
AND IFNULL(g.IsHidden,0) = 0 
AND (s.EventDate > DATE_ADD(NOW(), INTERVAL 0 HOUR) OR g.CreateDate > DATE_ADD(DATE_ADD(NOW(), INTERVAL -1 DAY), INTERVAL 0 HOUR)) 
GROUP BY g.GroupID, g.GroupName 
ORDER BY s.EventDate, g.GroupName; 

Я уже следующие показатели:

ALTER TABLE Groups ADD INDEX (OrganizationID); 
ALTER TABLE Groups ADD INDEX (IsActive); 
ALTER TABLE Groups ADD INDEX (CreateDate); 
ALTER TABLE Groups ADD INDEX (IsDeleted); 
ALTER TABLE Groups ADD INDEX (IsHidden); 
ALTER TABLE Groups ADD INDEX (GroupName); 
ALTER TABLE Schedule ADD INDEX (EventDate); 

Перед показатели были добавлен запрос занимает 18 секунд, так что это уже значительное улучшение. Но я не могу понять, почему этот запрос все еще занимает так много времени. Самая большая таблица в соединении - Schedule, которая имеет 13 216 записей - не огромная таблица! Остальные таблицы намного меньше.

EXPLAIN результаты: enter image description here

Что я могу сделать, чтобы улучшить свою производительность запросов?

+1

Что говорит план выполнения? – Taryn

+0

Почему вы делаете Date_add 0 часов? –

ответ

2

Это запрос:

SELECT g.GroupID, g.GroupName, count(s.EventDate) AS Total 
FROM Groups g LEFT JOIN 
    Schedule s 
    ON g.GroupID = s.GroupID 
WHERE g.OrganizationID = 2 AND 
     g.IsActive = 1 AND 
     IFNULL(g.IsDeleted,0) = 0 AND 
     IFNULL(g.IsHidden,0) = 0 AND 
     (s.EventDate > DATE_ADD(NOW(), INTERVAL 0 HOUR) OR g.CreateDate > DATE_ADD(DATE_ADD(NOW(), INTERVAL -1 DAY), INTERVAL 0 HOUR)) 
GROUP BY g.GroupID, g.GroupName 
ORDER BY s.EventDate, g.GroupName; 

Лучший показатель для этого запроса является составной индекс на groups: groups(OrganizationId, IsActive, IsDeleted, IsHidden, CreateDate, GroupId). Последние три столбца предназначены для покрытия предложения where. А затем индекс на schedule(GroupId, EventDate). Отсутствие индекса на schedule(GroupId), вероятно, является причиной ваших проблем с производительностью.

Далее, вы делаете заказ s.EventDate. Это не имеет смысла. Вы не выбираете s.eventDate, и он определяется, когда имеется более одного значения.

Я не понимаю, что должен делать двойной date_add(). Добавление interval 0 hour ничего не делает. Эти действия не влияют на производительность, но они выглядят неудобно.

+0

Я добавил составной индекс для групп, и это не помогло. Та же скорость. Затем я добавил композицию для расписания (GroupId, EventDate), а WOW - запрос выполняется в 47 мс! Спасибо. Заказ по eventdate имеет смысл в контексте моего приложения. Интервал 0 час является динамическим, и иногда там есть значение. Просто в этом примере не было. – HerrimanCoder

+0

99.3% улучшение. , , довольно хорошо. ;) –

+0

Довольно хорошо. Shazam !!! Мои бедные пользователи терпели это в течение 6 месяцев. Мне стыдно... – HerrimanCoder

Смежные вопросы