InnoDB przechowuje „szerokie” tabele w inny sposób. Zamiast umieszczać wszystkie kolumny razem w jednym ciągu (plus narzut, taki jak długość itp.), wykonuje następujące czynności:
- Jeśli suma wszystkich kolumn w danym wierszu przekroczy około 8 KB, część danych zostanie przeniesiona do innego („niezarejestrowanego”) obszaru przechowywania.
- Które kolumny są przenoszone poza rekord, zależy od rozmiarów kolumn itp.
- Szczegóły zależą od
ROW_FORMAT
wybrany. - „Niezarejestrowane” to kolejny blok (lub bloki) 16 KB.
- Później, wykonując
SELECT *
(lub przynajmniej pobranie kolumny (kolumn) poza zapisem), musi wykonać kolejne pobranie dysku.
Co robić?
- Pomyśl o tak wielu kolumnach.
- Rozważ „partycjonowanie pionowe”, w którym masz inne tabele zawierające wybrany
TEXT
kolumny. Zaproponuj wybór grup kolumn na podstawie wzorców dostępu w Twojej aplikacji. - W przypadku kolumn, które zwykle są dość długie, rozważ skompresowanie ich w kliencie i przechowywanie w
BLOB
zamiastTEXT
. Większość „tekstów” kurczy się 3:1. Bloby są wysyłane poza rekordami, tak samo jak Teksty, jednak te skompresowane bloby byłyby mniejsze, a zatem mniej prawdopodobne, że się rozleją. - Wykonaj więcej przetwarzania w SQL — aby uniknąć zwracania wszystkich wierszy, aby uniknąć zwracania pełnego tekstu itp. Kiedy na ślepo przepychasz dużą ilość tekstu do klienta, sieć i klient stają się istotnym czynnikiem w upływającym czasie, nie tylko
SELECT
, sam.