Я пытаюсь оптимизировать запрос выбора 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