оптимизировать запрос выбора MySQL на многие к одному - PullRequest
0 голосов
/ 16 августа 2011

Я пытаюсь оптимизировать запрос выбора MySQL, но я просто не могу понять, как это сделать.

Я читал здесь и любые другие релевантные результаты на Google, но не могу найти никого с вполне моей проблемой, надеюсь, это не потому, что я создал действительно плохие таблицы БД

Iиметь три таблицы, Таблица A, Таблица B, Таблица C

Таблица A имеет отношение один к одному с таблицей B

и

Таблица A имеет отношение один ко многимс таблицей C

, потому что мне нужна вся информация из таблицы c, которая относится к каждой строке в таблице AI, использую GROUP BY для сжатия результатов до количества релевантных результатов из таблицы A.

К сожалению, при добавлении GROUP BY это приводит к тому, что mysql создает таблицу временных показателей, которая все замедляет.

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

У меня также есть заказ в моем запросе.Если я удаляю GROUP BY, я получаю все строки в таблице A, а также сгущающие результаты таблицы C, НО он делает все это за доли секунды.

С GROUP BY и с или безORDER BY, поскольку mysql затем использует таблицу tmp, это занимает от 2 до 15 секунд в зависимости от любых других необходимых критериев.

Это в основном мой запрос (хотя детали были изменены по соображениям безопасности)

SELECT 
table_a.*, table_b.*, table_c.*
FROM `table_a` 
LEFT JOIN table_b ON table_b.ID = table_a.table_b_id 
LEFT JOIN table_c ON table_a.ID = table_c.table_a_id AND table_c.deleted !='yes' 
WHERE table_a.deleted !='yes' AND table_b.deleted !='yes' 
GROUP BY table_a.ID 
ORDER BY table_a.date_added DESC

У меня около 15 тыс. Результатов в таблице а и 100 тыс. Результатов в таблице с

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

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

Можно ли сделать этот запрос более эффективным или я просто застрял, потому чтокак мои таблицы настроены?


Спасибо за ответ.

Извините, я должен был упомянуть, что я пробовал group by и order, являющийся тем же значением table_a.ID, но из mysqlПОЯСНИТЕ, что по-прежнему, похоже, используется таблица tmp.

Из тестирования кажется, что удаление порядка по и просто группирование по-прежнему не работает, хотя порядок по порядку сам по себе хорош, он просто возвращает ВСЕ результаты.

Однако, делая EXPLAIN, я заметил, что возможный_ключ и ключ оба равны нулю для table_a, хотя table_b и table_c сообщают с использованием столбца для возможных_ключей и ключа.

Должен ли я бытьполучить от EXPLAIN указание на то, что table_a имеет ключ?

Matt


Извините, phpmyadmin, so не лучший макет.

id select_type тип таблицы возможный_ключи ключ key_len ref строки Extra 1 SIMPLE table_a ALL NULL NULL NULL NULL 13297 Использование где;Используя временные;Использование файловой сортировки 1 SIMPLE table_b eq_ref PRIMARY, ID, PRIMARY 3 db.table_a.table_b_id 1 Использование где 1 SIMPLE table_c ref table_a_id table_a_id 3 db.table_a.ID 9

1 Ответ

0 голосов
/ 16 августа 2011

Если у вас есть GROUP BY и ORDER BY с разными полями, вы почти всегда получите временную таблицу.

В качестве примечания: Вы можете выбрать непредвиденные результаты из-за включения всех полей, но только группировки по table_a.ID. Записи в таблице C могут быть искажены.

...