2015-03-31 5 views
-1

У меня есть запрос, как показано ниже, пожалуйста, дайте правильный указатель для этого, таблица контактов имеет более 20 тыс. Записей, и загрузка занимает около 20 секунд. Надеюсь, что предложение group by создает проблему, если я удаляю общую запись group by clause более 300k.MYSQL GROUP BY - медленный запрос

SELECT `a`.*, CONCAT(a.`firstname`, " ", a.`lastname`) AS `cont_name`, CONCAT(a.`position`, "/", a.`company`) AS `comp_pos`, `e`.`name` AS `industry_name`, CONCAT(f.`firstname`, " ", f.`lastname`) AS `created_by` 
FROM `contacts` AS `a` 
LEFT JOIN `user_centres` AS `b` ON a.user_id = b.user_id 
LEFT JOIN `group_contacts` AS `c` ON a.id = c.contact_id 
LEFT JOIN `groups` AS `d` ON c.group_id = d.id 
LEFT JOIN `industries` AS `e` ON e.id = a.industry_id 
LEFT JOIN `users` AS `f` ON f.id = a.user_id 
WHERE (1) 
GROUP BY `a`.`id` 
ORDER BY `a`.`created` desc 

Объясняет это как показано на рисунке - 20145 Использование временных; Использование FileSort

+0

Снимите 'группы by'. У вас нет функций агрегации, поэтому это не кажется необходимым. –

+0

Можете ли вы опубликовать полные объяснения и раскладки таблиц? Нужны ли ЛЕВЫЕ ВНЕШНИЕ СОБЫТИЯ, или вы можете просто использовать INNER JOINs? – Kickstart

+1

LEFT JOIN 'group_contacts' AS' c' ON a.id = c.contact_id LEFT JOIN 'groups' AS' d' ON c.group_id = d.id - необязательные объединения ... удалите его – Javaluca

ответ

0

Вы можете попробовать эти шаги

  1. Там нет использования таблицы группы (г), так что вы можете удалить оставленные присоединиться к группе из этого запроса
  2. Добавить индекс для user_id, contact_id и industry_id (Я надеюсь, что эти идентификаторы соединяют таблицы primary_keys) в таблице контактов
  3. проверьте эти идентификаторы user_id, contact_id и industry_id Типы (INT) одинаковы.
0

Наше требование, как показано ниже

1) перечень всех контактов в админ логин

2) Центр мудрый список контактов в менеджер/клерк логин

Всего записей в контактной таблице > 20K.

В таблице user_centres будет отображаться несколько записей, то есть: пользователю присваивается несколько центров.

Выполнение запроса на сервере, исключая GROUP BY, составляет почти 3 lakhs-данных, что создает проблему.

Я подробно рассмотрел проблему и упростил запрос, как показано ниже, здесь соединение с таблицей user_centres предназначено для централизованной фильтрации данных.

SELECT `a`.*, CONCAT(a.`firstname`, " ", a.`lastname`) AS `cont_name`, 
CONCAT(a.`position`, "/", a.`company`) AS `comp_pos`, `e`.`name` AS `industry_name`, 
CONCAT(f.`firstname`, " ", f.`lastname`) AS `created_by` FROM `contacts` AS `a` 
LEFT JOIN `users` AS `f` ON f.id = a.user_id 
LEFT JOIN `user_centres` AS `b` ON a.user_id = b.user_id 
LEFT JOIN `industries` AS `e` ON e.id = a.industry_id 
WHERE (b.centre_id IN (23, 24, 25, 26, 20, 21, 22, 27, 28)) 
GROUP BY `a`.`id` ORDER BY `a`.`created` desc 

EXPLAIN дает результат, как: - 1 SIMPLE индекса PRIMARY, user_id, area_id, industry_id, страна ОСНОВНОЙ 4 NULL 20145 Использование временного; Использование FileSort

Пожалуйста, обратитесь экраны для получения дополнительной помощи

Контакт стол - http://prntscr.com/6o5gw4

user_centres стол - http://prntscr.com/6o5h30

+0

Результат EXPLAIN - http://prntscr.com/6o5h8s –

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