Какие данные включаются, когда MySQL создает временную таблицу? - PullRequest
4 голосов
/ 28 ноября 2011

Я читал о преобразовании полей VARCHAR в поля CHAR всякий раз, когда MySQL генерирует временную таблицу.

Если у меня есть следующая таблица ...

  • Превышение 100К строк
  • Дюжина столбцов VARCHAR установлена ​​на реальную длину (например, 10 для телефонных номеров)
  • 5 столбцов VARCHAR, установленных на 15 КБ (с длинами, которые могут быть как 20, но до 15 К в худшем случае)

И, скажем, у меня есть этот запрос ...

  • Возвращает несколько столбцов, включая VARCHAR
  • СОЕДИНЯЕТСЯ с полдюжины других таблиц ( не в столбцах VARCHAR)
  • Сортирует строки по дате и числовому идентификатору (т. Е. не в столбцах VARCHAR)
  • Имеет предложение WHERE, которое не включает поля VARCHAR
  • имеет ограничение в 12 строк

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

Например, включает ли таблица только столбцы, необходимые для выбора возвращаемых строк (т. Е. Те, которые указаны в предложениях WHERE и ORDER BY), за которыми следует механизм базы данных, определяющий 12 строк в LIMIT, и затем считывающий данные только для этих 12 строк? Или же большая часть данных включена во временную таблицу (например, все потенциальные строки, включая длинные столбцы VARCHAR)?

Ответы [ 2 ]

1 голос
/ 28 ноября 2011

Если временная таблица соответствует ограничениям памяти , она создается с использованием HEAP (модуль памяти) .Все ограничения применяются.Если он становится слишком большим, сервер преобразует его во временную таблицу MyISAM на диске.

0 голосов
/ 13 мая 2013

У меня была похожая ситуация, когда я пытался выяснить, нужно ли просто иметь TEXT или BLOB в таблице для принудительной установки дисковой временной таблицы, когда MySQL должен создать временную таблицу или что этотакже зависит от того, находится ли этот столбец в запросе (SELECT или WHERE предложение).

Это был запрос (posts.body имеет тип TEXT)

SELECT * FROM posts p LEFT JOIN user u ON p.user_id = u.id LEFT JOIN setting s ON u.id = s.user_id WHERE (p.title LIKE '%search%' AND (p.status = 'PUBLISH' AND p.date <= 1368441957)) GROUP BY u.id LIMIT 5

Я видел, что при выполнении этого увеличивается переменная Created_tmp_disk_tables.Поэтому я изменил запрос на

SELECT p.id FROM posts p LEFT JOIN user u ON p.user_id = u.id LEFT JOIN setting s ON u.id = s.user_id WHERE (p.title LIKE '%search%' AND (p.status = 'PUBLISH' AND p.date <= 1368441957)) GROUP BY u.id LIMIT 5

И, что интересно, счетчик не увеличился.Однако в документации MySQL упоминается следующее, что отличается от моего вывода

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

Наличие столбца BLOB или TEXT в таблице

...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...