InnoDB slaat "brede" tabellen op een andere manier op. In plaats van alle kolommen samen te voegen in een enkele string (plus overhead, zoals lengtes, enz.), doet het het volgende:
- Als het totaal van alle kolommen voor een bepaalde rij groter is dan ongeveer 8 KB, wordt een deel van de gegevens naar een ander ("off-record") opslaggebied verplaatst.
- Welke kolommen off-record worden verplaatst, hangt af van de grootte van de kolommen, enz.
- De details zijn afhankelijk van de
ROW_FORMAT
gekozen. - "Off-record" is nog een blok (of blokken) van 16 KB.
- Later, bij het doen van
SELECT *
(of op zijn minst de off-record kolom(men) ophalen), moet het een andere disk fetch doen.
Wat te doen?
- Denk er eens over na om zoveel kolommen te hebben.
- Overweeg "verticale partitionering", waarin je een andere tabel(len) hebt die geselecteerde
TEXT
bevatten kolommen. Stel voor groepen kolommen te kiezen op basis van toegangspatronen in uw app. - Voor kolommen die meestal vrij lang zijn, kunt u overwegen ze in de client te comprimeren en op te slaan in een
BLOB
in plaats van eenTEXT
. De meeste "tekst" krimpt 3:1. Blobs worden op dezelfde manier off-record verzonden als Teksten, maar deze gecomprimeerde blobs zijn kleiner, waardoor ze minder snel worden gemorst. - Doe meer verwerking in SQL -- om te voorkomen dat alle rijen worden geretourneerd, of om te voorkomen dat de volledige tekst wordt geretourneerd, enz. Wanneer blindelings veel tekst naar een client wordt verplaatst, worden het netwerk en de client een belangrijke factor in de verstreken tijd, niet alleen de
SELECT
, zelf.