MySQL TEXT производительность поля
У меня есть несколько полей TEXT и / или MEDIUMTEXT в каждой из наших 1000 таблиц MySQL. Теперь я знаю, что поля TEXT записываются на диск, а не в память при запросе. Это также верно, даже если это поле не вызывается в запросе? Например, если у меня есть таблица (tbExam) с 2 полями (id int(11) и текст комментария), и я запускаю SELECT id FROM tbExam, MySQL все еще должен записать это на диск перед возвратом результатов или он выполнит этот запрос в памяти?
Я пытаюсь выяснить, нужно ли мне перенастроить наши фактические таблицы БД, чтобы перейти на varchar(xxxx) или оставить текстовые поля и перенастроить запросы.
1 ответ
Теперь я знаю, что текстовые поля записываются на диск, а не в память при запросе
TEXT
поля записываются на диск только тогда, когда для запроса требуется временная таблица для хранения промежуточных результатов нескольких операций сортировки или агрегирования. Это, например, происходит, когда вы смешиваете DISTINCT
, ORDER BY
а также GROUP BY
на разных столбцах в пределах одного запроса.
Если твой TEXT
столбец не является частью этой временной таблицы, MySQL
сначала попытаться создать его с помощью MEMORY
двигатель (который не поддерживает TEXT
).
MyISAM
Движок для временной таблицы будет выбран только в том случае, если размер этой таблицы превысит @@tmp_table_size
или есть несколько столбцов MEMORY
не поддерживается.
Для такого запроса:
SELECT id
FROM tbExam
временная таблица вообще не понадобится.
Есть небольшая разница в том, как InnoDB
плагин хранилища (который отвечает за взаимодействие между InnoDB
а также MySQL
) ведет себя по отношению к TEXT
а также VARCHAR
поля: VARCHAR
поле передается в буфер набора записей по значению, в то время как TEXT
поле передается по ссылке.
Внутренне InnoDB
магазины TEXT
а также VARCHAR
Поля аналогичным образом: in-row, если весь столбец помещается на половину страницы, out-of-row, если нет. Разница выше касается только InnoDB / MySQL
вопросы взаимодействия.
Если вы не запрашиваете эти поля, то никакой разницы нет.