Оптимизация запросов в MySQL

#mysql #query-optimization

#mysql #оптимизация запросов

Вопрос:

Является ли запрос 1 более оптимизированным, скажем, для базы данных большего размера, чем запрос 2, даже незначительным, или я просто удваиваю работу с дополнительным предложением WHERE?

Запрос 1:

 SELECT sample_data
FROM table1 INNER JOIN table2 ON table1.key = table2.key
WHERE table1.key = table2.key;

 

Запрос 2:

 SELECT sample_data
FROM table1 INNER JOIN table2 ON table1.key = table2.key;
 

Потому что я прочитал эту статью, в которой говорилось, что использование фильтров в предложениях JOIN повышает производительность..:

введите описание изображения здесь

Комментарии:

1. Я думаю, что проблема здесь в том, что ваш запрос 1 не имеет смысла, возможно, проверьте его и используйте другой пример

2. @Nae это из этой статьи docs.magento.com/mbi/best-practices /…

Ответ №1:

Является ли запрос 1 более оптимизированным, скажем, например, для более крупной базы данных, чем запрос 2?

Нет, он не стал более оптимизированным. Запрос 2 — это правильный способ обработки соединения. Запрос 1 делает то же самое, но с дополнительными формулировками, чтобы программное обеспечение сервера MySQL очистилось, поскольку оно выясняет, как удовлетворить ваш запрос.

Рекомендации в документации Adobe о фильтрации обеих таблиц в соединении не относятся к условию включения соединения. В их примере говорится, что нужно это сделать…

     SELECT whatever, whatever
      FROM table1
      JOIN table2 ON table2.table1_id = table1.table1_id
     WHERE table1.date >= '2021-01-01'
       AND table2.date >= '2021-01-01'    /* THIS LINE IS WHAT THEY SUGGEST */
 

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

Позвольте мне добавить к этому. SQL — это так называемый «декларативный» язык. Вы объявляете, что вы хотите, и сервер MySQL выясняет, как это получить для вас. Программное обеспечение SQL становится действительно хорошим в этом; имейте в виду, что MySQL уже четверть века. За это время его программисты постоянно совершенствовали его, выясняя, как получить материал. Вы, вероятно, не сможете перехитрить это. Но вам может потребоваться добавить индексы, когда ваши таблицы станут действительно большими. https://use-the-index-luke.com /

Другие языки являются «процедурными»: вы, как программист, излагаете процедуру получения того, что вы хотите. Вам не нужно делать это для SQL.

Ответ №2:

Мне нравится выражаться так:

  • ON здесь вы указываете, как связаны таблицы.
  • WHERE предназначен для фильтрации.

Это упрощает понимание человеком, читающим запрос.

На самом деле (для MySQL), JOIN (он же INNER JOIN ) обрабатывает ON и WHERE одинаково. То есть разницы в производительности нет. В вашем запросе 1 излишне дважды указывается «отношение».

Кроме того, оптимизатор MySQL достаточно умен, чтобы понимать, когда два столбца имеют одинаковое значение. Например,

 SELECT ...
    FROM a
    JOIN bb  ON a.foo = bb.foo
    WHERE       a.foo = 123
 

Если Оптимизатор решит, что начинать с фильтра bb.foo = 123 более оптимально, он так и сделает. Примечание: это не то же самое, что в примере, который вы показали; он объединяет одно ( id ), но фильтрует другое ( date ) . Два запроса там не эквивалентны!

LEFT JOIN , обязательно лечит ON и WHERE по-разному. (Но это уже другая тема.)