2017-02-08 7 views
1

Я не очень осведомлен о mysql. Так что простите, если это глупый вопрос.Может ли запрос к столбцу TEXT привести к созданию временной таблицы?

Сегодня я получил звонок от моего администратора базы данных, что в число временных таблиц создается мое приложение.

За исключением того, что я не создаю какую-либо временную таблицу явно.

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

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

Мой вопрос, как разработчик, как я могу понять, когда QUERY создаст временную таблицу (в фоновом режиме).

Я сделал некоторые погуглите и обнаружил, что я могу сделать что-то вроде

show GLOBAL status like 'created_tmp_disk_tables' 

, но то, что это говорит мне? как я могу узнать, вызвал ли MY-запрос временную таблицу.

ответ

1

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

  • подзапросов
  • GROUP BY
  • UNION
  • Запрос через VIEW
  • Общие табличные выражения (WITH ... синтаксис)

Более полное руководство по тому, когда MySQL использует «внутренние» временные таблицы приведены в документации: https://dev.mysql.com/doc/refman/5.7/en/internal-temporary-tables.html

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

Таблицы Temp довольно дороги для использования MYSQL Server, поэтому нам нравится избегать их, когда это возможно. Особенно дорого, когда временная таблица записывается в файловую систему, а не остается в памяти. Это происходит, когда таблица temp включает в себя столбцы TEXT или BLOB, или если требуется хранить больше строк, чем может поместиться в объеме памяти, ограниченном параметром конфигурации tmp_table_size.

Вы можете (в основном) указать, когда ваш запрос будет использовать временную таблицу, проанализировав запрос с помощью EXPLAIN. См. https://dev.mysql.com/doc/refman/5.7/en/explain.html

Иногда внутренние таблицы temp неизбежны, так как нет другого способа получить результат запроса, который вам нужен. Но иногда вы можете переписать свой SQL-запрос или использовать индексы, чтобы помочь получить тот же результат без использования временной таблицы. Это зависит от конкретного запроса и определений таблиц.Оптимизация запросов - это процесс, который должен выполняться в каждом конкретном случае.

1

Чтобы определить, требует ли инструкция временную таблицу, используйте EXPLAIN и проверьте столбец «Дополнительно», чтобы узнать, говорит ли он «Использовать временные».

От documentation:

Сервер создает временные таблицы в условиях, таких как эти:

  • Оценка операторов UNION, с некоторыми исключениями описаны позже.

  • Оценка некоторых видов, которые используют алгоритм TEMPTABLE,UNION или агрегацию.

  • Оценка производных таблиц (подзапросы в предложении FROM).

  • Таблицы, созданные для материального обеспечения подзапроса или полу-соединения (см. Раздел 9.2.1.18, «Оптимизация подзапроса»).

  • Оценка утверждений, которые содержат заказ по п и различных предложений GROUP BY, или для которых ORDER BY или GROUP BY содержит столбцы из других, чем в первой таблице таблиц в соединении очереди.

  • Оценка DISTINCT в сочетании с ORDER BY может потребовать временную таблицу .

  • Для запросов, которые используют опцию SQL_SMALL_RESULT, MySQL использует в памяти временной таблицы, если запрос не содержит также элементы (описанные далее), которые требуют на диске для хранения.

  • Оценка операторов UPDATE с несколькими таблицами.

  • Оценка выражений GROUP_CONCAT() или COUNT (DISTINCT).

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

  • наличие BLOB или TEXT в таблице

  • Наличие любого столбца строки в предложении GROUP BY или DISTINCT больше чем 512 байт для двоичных строк или 512 символы для недвоичных строк . (Это применимо только до MySQL 5.7.5. Кроме того, перед MySQL 5.7.3, предел составляет 512 байт, независимо от типа строки.)

  • Присутствие любого столбца строки с максимальной длиной больше, чем 512 (байты для бинарных строк, символов небинарных строк) в SELECT, списка, если UNION или UNION ALL используются

  • в шоу КОЛОННЫ и ОПИСАТЬ операторы используют BLOB как тип для некоторых колонн, при этом временной таблице, используемым для результатом является таблица на диске .