Должен ли я избегать JOIN, когда MySQL не оптимизирует их? - PullRequest
0 голосов
/ 16 мая 2018

В университетской базе данных по курсу SQL было все о соединениях между таблицами. Поэтому я принял общий подход: сначала выполните все необходимые СОЕДИНЕНИЯ, затем выберите данные, отфильтруйте их при помощи WHERE, GROUP BY, когда это необходимо. Таким образом, код и логика просты.

Но очень часто, когда все усложняется, чем один ЛЕВОЕ СОЕДИНЕНИЕ, у меня очень низкая производительность.

Сегодня я просто переписал запрос JOIN, который выполняется за 600 секунд. к другому подходу с: ВЫБРАТЬ (ВЫБРАТЬ ... ГДЕ ИД = X.ID) ОТ Х а также ВЫБРАТЬ ... ГДЕ Y В (ВЫБРАТЬ ...) и теперь он заканчивается через 0,0027 секунды.

Я разочарован, я использую индексы для полей, к которым я присоединяюсь, но производительность настолько низкая ...

1 Ответ

0 голосов
/ 23 мая 2018

LEFT JOIN может , но не всегда, заставляет сначала смотреть на «левый» стол.

JOINs (но не LEFT JOINs) плюс WHEREчто касается одной таблицы, дает Оптимизатору надежный и надежный совет сначала взглянуть на эту таблицу.

JOIN, а также WHERE, касающийся нескольких столов - оптимизатор иногдавыбирает правильную «первую» таблицу, иногда нет.

Оптимизатор обычно получает строки из одной таблицы (в зависимости от того, какая из них выбрана как лучшая для начала), затем выполняет NLJ (Соединение с вложенным циклом).Это означает попадание в следующую таблицу по одной строке за раз.Для этого «охвата» нужен хороший индекс.

IN ( SELECT ... ), в старых версиях было ужасно неоптимально.Теперь он может превратиться в «полусоединение», например EXIST ( SELECT ... ), и быть весьма эффективным.Иногда делать это вручную полезно.

"Взрывать-взрывать" поражает множество людей.Это где JOIN и GROUP BY.Группировка в основном состоит в том, чтобы вытеснить большое количество строк, созданных соединением.Иногда «производная» таблица может быть отличной оптимизацией.(Это ручная переформулировка запроса.)

Часто LEFT JOIN, который используется для агрегата, можно сложить примерно так: SELECT ..., ( SELECT SUM(foo) FROM ... ) AS foos, ..., тем самым уменьшая взрыва-взрыва.

Понимание преимуществ «составных» индексов, пожалуй, самая распространенная проблема на этом форуме.

Должен ли я идти дальше?Я сомневаюсь, что я охватил более 1/4 случаев.Итак, я согласен с @ leftjoin.

Вот несколько простых советов: http://mysql.rjweb.org/doc.php/index_cookbook_mysql

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...