Spec-Zone .ru
спецификации, руководства, описания, API

8.13.12.2. Блокируйте Алгоритм Вложенного цикла для Внешних объединений и Полуобъединений

В MySQL 5.7 исходная реализация алгоритма BNL расширяется, чтобы поддерживать операции полуобъединения и внешнее объединение.

Когда эти операции выполняются с буфером соединения, каждая строка, помещенная в буфер, предоставляется флагом соответствия.

Если работа внешнего объединения выполняется, используя буфер соединения, каждая строка таблицы, произведенной вторым операндом, проверяется на соответствие против каждой строки в буфере соединения. Когда соответствие находится, новая расширенная строка формируется (исходная строка плюс столбцы от второго операнда) и посылается дальнейшие расширения остающимися операциями соединения. Кроме того, флаг соответствия соответствующей строки в буфере включается. После того, как все строки таблицы, к которой присоединятся, были исследованы, буфер соединения сканируется. Каждая строка от буфера, которому не включали его флагу соответствия, расширяется NULL дополнения (NULL значения для каждого столбца во втором операнде), и посылал за дальнейшими расширениями остающимися операциями соединения.

С MySQL 5.6.3, block_nested_loop флаг optimizer_switch системная переменная управляет, как оптимизатор использует Блочный алгоритм Вложенного цикла. По умолчанию, block_nested_loop on. См. Раздел 8.8.5.2, "Управляя Переключаемой Оптимизацией".

Перед MySQL 5.6.3, optimizer_join_cache_level системные средства управления переменной присоединяются к организации буферизации данных. Для возможных значений этой переменной и их значений, см. описание в Разделе 5.1.4, "Системные Переменные Сервера".

В EXPLAIN вывод, использование BNL для таблицы показывается когда Extra значение содержит Using join buffer (Block Nested Loop) и type значение ALL, index, или range.

Для получения информации о стратегиях полуобъединения см. Раздел 8.13.16.1, "Оптимизируя Подзапросы с Преобразованиями Полуобъединения"