четверг, 6 марта 2014 г.

MySQL: VARCHAR vs TEXT

После обновления командой разработки структуры БД появилась таблица со 114 колонками, из которых 15 типа LOGTTEXT. По факту MySQL начал тормозить, даже на операциях, которые не должны вызывать проблем (обновление одного поля по первичному ключу). 
Мои изыскания на тему, может ли это быть основной/единственной причиной тормозов не дали положительного результата. Вот ссылки крупицы знаний, которые удалось найти:


TEXT and BLOB is stored off the table with the table just having a pointer to the location of the actual storage.
VARCHAR is stored inline with the table. VARCHAR is faster when the size is reasonable, the tradeoff of which would be faster depends upon your data and your hardware, you'd want to benchmark a realworld scenario with your data.
http://stackoverflow.com/questions/2023481/mysql-large-varchar-vs-text  


MySQL needs to allocate TEXT column separately which causes some overhead, but I guess it is minimal.
http://forums.mysql.com/read.php?24,105964,105984#msg-105984

TEXT data types are stored as separate objects from the tables and result sets that contain them. This storage is transparent — there is no difference in how a query involving a TEXT field is written versus one involving a VARCHAR field. Since TEXT is not stored as part of a row, retrieval of TEXT fields requires extra [edited 1/22] memory overhead.
http://www.pythian.com/blog/text-vs-varchar/
Если подытожить, то дополнительный расход есть, но он не должен быть значительным.

Тем не менее, мы от`ALTER`или таблицу и заменили LONGTEXT'ы на VARCHAR (благо в нашем случае объемные тексты не применялись).

О результатах сообщу дополнительно...

... похоже помогло.

После переделки LONGTEXT -> VARCHAR скорость вернулась на прежний уровень.