Как в Innodb хранятся varchar?
Насколько знаю, вместе с таблицей. Но если происходит обновление поля, на более длинный текст (например, было 'qwe', а стало 'qwerty'), куда записывается "излишек" ('rty')? Если в отличие от char дополнительное место не резервируется (нулями/пробелами), и не получится просто рядом "дописать" 'rty'. Получается, при обновлении varchar разным текстом, текст будет хранится кусками в разных частях таблицы? Ну а при частом изменении разной длинной вообще получается что-то крайне фрагментированное?
Хотя рано отметил решением. Мне бы больше технической инфы.
Например, у меня 80 тыс строк. Там, по-мимо int, ещё 4 поля varchar(255), что уже должно давать 80000 * 4 * 255 = 80Мб минимум. Хотя на деле, менее 50Мб.
Либо под "резервировать место" тут понимается не то же самое, что в файловых системах, тогда не ясно, чем такая резервация отличается от описания фрагментации в моём вопросе.
Т.е., допустим, таблица - файл .ibd. В строке пишем в varchar 'qwe', следом там другие поля. Потом решили обновить varchar, более длинным текстом, чем сейчас, но просто так его вписать нельзя - перезапишем следующее поле
для varchar отводится столько места, сколько он занял при первом инсерте. Если в процессе изменений длина увеличивается (но до указанного в определении поля предела), то сначала это увеличение делается за счет зарезервированного на странице места, а когда места не остается - страница расщепляется.
Если фактическая длина уменшается - никаких "сжатий" страниц не делается.
Из чего кстати можно сделать вывод, что для часто меняющихся строк может быть разумнее использовать char, вместо varchar. Оверхэд с занимаемым местом будет и там и там, но в случае с char не потребуется расщеплять страницу.
Сергей Пуговкин, А как вы в эти поля запишите больше чем указали размер? Ведь varchar не заполняет незанятое полностью поле пробелами, следовательно имеет разный размер байт.