Ключевые слова, используемые в SQL-запросе: выбрать, отдельный, из, присоединиться, по, где, сгруппировать, иметь, сумма, количество, максимум, среднее, упорядочить, ограничить
1. Порядок написания:
select->отличный->от->присоединиться->на->где->группировать по->наличие->порядок по->ограничение
Обязательные поля: выбрать, из
Необязательные поля: отдельные, присоединиться, по, где, сгруппировать, иметь, сумма, количество, максимум, среднее, упорядочить по, предел
2. Последовательность выполнения
from->on->join->where->group by (начните использовать псевдоним в select, псевдоним можно использовать в следующем выражении) ->sum, count, max, avg->having->select->distinct->order by->limit
Примерный порядок выполнения mysql следующий:
-
со сцены
-
где сцена
-
группировать по этапам
-
имеющий сцену
-
выберите этап
-
порядок по этапам
-
предельная стадия
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_switch
block_nested_loop
on
-
При выборе алгоритма соединения будет приоритет.Теоретически он будет приоритетным для определения возможности использования INLJ и BNLJ:
Index Nested-LoopJoin > Block Nested-Loop Join > Simple Nested-Loop Join
Ссылка на ссылку: