Порядок выполнения mysql и алгоритм индексации

Ключевые слова, используемые в SQL-запросе: выбрать, отдельный, из, присоединиться, по, где, сгруппировать, иметь, сумма, количество, максимум, среднее, упорядочить, ограничить

1. Порядок написания:

select->отличный->от->присоединиться->на->где->группировать по->наличие->порядок по->ограничение

Обязательные поля: выбрать, из

Необязательные поля: отдельные, присоединиться, по, где, сгруппировать, иметь, сумма, количество, максимум, среднее, упорядочить по, предел

2. Последовательность выполнения

from->on->join->where->group by (начните использовать псевдоним в select, псевдоним можно использовать в следующем выражении) ->sum, count, max, avg->having->select->distinct->order by->limit

Примерный порядок выполнения mysql следующий:

  1. со сцены

  2. где сцена

  3. группировать по этапам

  4. имеющий сцену

  5. выберите этап

  6. порядок по этапам

  7. предельная стадия

3. Вопросы

Вопрос: Почему псевдонимы полей нельзя использовать в where, но можно использовать в порядке by?

Поскольку порядок выполнения select более поздний, фаза запроса, выполненная до него, не может быть использована. Порядок по этапам отстает от выбора, поэтому можно использовать псевдонимы полей.

В-четвертых, значение ключевых слов

  • from : из какой таблицы данных нужно получить данные (необходимо получить эту таблицу данных)
  • join : связать таблицы, которые необходимо связать с запросом (необходимо связать таблицу запроса)

При выполнении связанного запроса база данных выбирает управляющую таблицу, а затем использует записи этой таблицы для связывания с другими таблицами. Левые соединения обычно используют
левую таблицу в качестве управляющей таблицы (правые соединения — это, как правило, правая таблица), а внутренние соединения обычно используют таблицу с меньшим количеством наборов результатов в качестве управляющей таблицы. В некоторых случаях левое соединение оптимизируется оптимизатором запросов как внутреннее соединение.

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

Примечание. Вы можете использовать объяснение, чтобы найти таблицу драйверов, первая таблица в результате — это таблица драйверов, но план выполнения может измениться, когда он действительно выполняется.

  • on : условие ассоциации

  • где : Условия фильтрации данных в таблице

    • Порядок выполнения: снизу вверх, справа налево
    • Примечание: это влияет на записи базы данных, но не на результаты агрегирования.Условия, которые могут отфильтровать максимальное количество записей, должны быть записаны в конце предложения where, а функции агрегирования (sum, count, max, avg) не могут использоваться.
  • group by : как сгруппировать данные, отфильтрованные выше

    • Порядок выполнения: слева направо
    • Примечание: попробуйте использовать фильтр where перед группировкой, избегайте использования фильтра после этого.
  • среднее : среднее значение

  • наличие : условия для фильтрации вышеуказанных сгруппированных данных

    • Примечание. Отфильтруйте результаты агрегации, так как это очень ресурсоемко, вы можете использовать функцию агрегации

    • Пример: Зоны скрининга со статистическим населением более 100 Вт.

      выберите регион, сумму (население), сумму (область) из группы bbc по региону, имеющую сумму (население)> 1000000, вы не можете использовать where для фильтрации областей, превышающих 100 Вт, потому что такой записи нет

  • select : просмотреть, какой столбец или результат вычисления столбца в наборе результатов

  • отличные : дедуплицировать повторяющиеся значения в результирующем наборе

  • order by : В каком порядке просматривать возвращенные данные

    • Порядок выполнения: слева направо
    • Примечание: очень ресурсоемкий
  • limit : перехватить данные целевой страницы

5. Алгоритм, используемый при ассоциации индекса

  • В случае индексированных соединений существует два алгоритма Index Nested-Loop join(соединение цикла применения индекса) и Batched Key Access join(соединение пакетного доступа по ключу).
  • В случае, когда ассоциация индекса не используетсяSimple Nested-Loop join , существует два алгоритма (простое соединение вложенного цикла) и Block Nested-Loop join(соединение вложенного цикла с кэшированным блоком).

Анализ алгоритмов

  • Simple Nested-Loop join(SNLJ, простое соединение с вложенным циклом) Алгоритм: в соответствии с условием извлеките часть данных из ведущей таблицы, затем просканируйте всю таблицу в ведомую таблицу и поместите соответствующие записи в окончательный набор результатов. Таким образом, каждая запись ведущей таблицы сопровождается полным сканированием ведомой таблицы.
    • Количество совпадений: количество строк во внешней таблице * количество строк во внутренней таблице.
  • Index Nested-Loop Join(INLJ, Index Nested Loop Join) Алгоритм: Index Nested Loop Join — это алгоритм соединения на основе индекса, а индекс основан на внутренней таблице.Сопоставление условий внешней таблицы напрямую сопоставляется с индексом внутренней таблицы, избегая сравнения с каждой записью внутренней таблицы, так что запрос с использованием индекса уменьшает количество совпадений для внутренней таблицы
    • Количество совпадений: количество строк во внешней таблице * высота индекса внутренней таблицы.
  • Block Nested-Loop JoinАлгоритм (BNLJ, соединение вложенного цикла с блоком кэша): соединение с вложенным циклом блока кэша кэширует несколько фрагментов данных одновременно, кэширует столбцы, участвующие в запросе, в буфере соединения, а затем сопоставляет данные в буфере соединения с данными во внутренней таблице в пакетах, тем самым уменьшая количество внутренних циклов (данные внешней таблицы в буфере соединения могут сопоставляться пакетами один раз путем однократного обхода внутренней таблицы).
    Когда не используется Index Nested-Loop Join, использовать по умолчаниюBlock Nested-Loop Join
  • Batched Key Access join(BKAJ) Алгоритм: аналогичен алгоритму SNLJ, но в объединенной таблице доступен индекс. Прежде чем строки будут отправлены в объединенную таблицу, строки сортируются в соответствии с полем индекса, что уменьшает случайный ввод-вывод. Сортировка — это самое большое различие между ними, но что, если в объединенной таблице не используется индекс? Тогда используйте BNLJ

6. Что это Join Buffer?

  • Join BufferКэшируются все столбцы, участвующие в запросе, а не только столбцы соединения.

  • join_buffer_sizeВы можете настроить размер кэша ,

  • join_buffer_sizeЗначение по умолчанию — 256 КБ, join_buffer_sizeмаксимальное значение MySQL 5.1.22— до версии 4G, а более поздняя версия может применяться для пространства, превышающего 64-разрядную операционную 4Gсистему Join Buffer.

  • Для использования алгоритма требуется, чтобы настройка Block Nested-Loop Joinконфигурации управления оптимизатором была включена , и по умолчанию включено.optimizer_switchblock_nested_loopon

  • При выборе алгоритма соединения будет приоритет.Теоретически он будет приоритетным для определения возможности использования INLJ и BNLJ:
    Index Nested-LoopJoin > Block Nested-Loop Join > Simple Nested-Loop Join

Ссылка на ссылку:

  1. Последовательность выполнения SQL

  2. Порядок выполнения MySQL

Guess you like

Origin blog.csdn.net/qq_44113347/article/details/131372628