InnoDB съхранява "широки" таблици по различен начин. Вместо да има всички колони заедно в един низ (плюс допълнителни разходи, като дължини и т.н.), той прави следното:
- Ако сборът на всички колони за даден ред надвишава около 8 KB, това ще премести част от данните в друга („незаписана“) област за съхранение.
- Кои колони се преместват без запис зависи от размерите на колоните и т.н.
- Подробностите зависят от
ROW_FORMAT
избран. - „Незаписан“ е друг блок (или блокове) от 16 KB.
- По-късно, когато правите
SELECT *
(или поне извличане на незаписаните колони), трябва да направи друго извличане на диск.
Какво да правя?
- Преосмислете наличието на толкова много колони.
- Помислете за „вертикално разделяне“, при което имате друга таблица(и), която съдържа избран
TEXT
колони. Предложете да изберете групи от колони въз основа на моделите за достъп в приложението си. - За колони, които обикновено са доста дълги, обмислете компресирането им в клиента и съхраняването им в
BLOB
вместоTEXT
. Повечето "текстове" се свиват 3:1. Петната се изпращат незаписани по същия начин като текстовите съобщения, но тези компресирани петна биха били по-малки, следователно е по-малко вероятно да се разлеят. - Извършете повече обработка в SQL -- за да избегнете връщането на всички редове или за да избегнете връщането на пълния текст и т.н. Когато сляпо изхвърляте много текст на клиент, мрежата и клиентът се превръщат във важен фактор за изминалото време, не само
SELECT
, себе си.