sql >> Database teknologi >  >> RDS >> Mysql

Stort antal kolonner, Vælg alle tager evigt

InnoDB gemmer "brede" tabeller på en anden måde. I stedet for at have alle kolonnerne samlet i en enkelt streng (plus overhead, såsom længder osv.), gør den følgende:

  • Hvis summen af ​​alle kolonner for en given række overstiger ca. 8KB, vil det flytte nogle af dataene til et andet ("off-record") lagerområde.
  • Hvilke kolonner der flyttes off-record afhænger af kolonnernes størrelse osv.
  • Detaljen afhænger af ROW_FORMAT valgt.
  • "Off-record" er en anden 16KB blok (eller blokke).
  • Senere, når du laver SELECT * (eller i det mindste henter den/de ikke-registrerede kolonne(r)), skal den udføre endnu en diskhentning.

Hvad skal man gøre?

  • Genovervej at have så mange kolonner.
  • Overvej "lodret partitionering", hvor du har en anden tabel(er), der indeholder valgt TEXT kolonner. Foreslå at vælge grupper af kolonner baseret på adgangsmønstre i din app.
  • For kolonner, der normalt er ret lange, kan du overveje at komprimere dem i klienten og gemme dem i en BLOB i stedet for en TEXT . Det meste "tekst" krymper 3:1. Blobs sendes off-record på samme måde som tekster, men disse komprimerede klatter ville være mindre, og derfor mindre tilbøjelige til at spilde.
  • Foretag mere bearbejdning i SQL -- for at undgå at returnere alle rækkerne, eller for at undgå at returnere den fulde tekst osv. Når du blindt skovler masser af tekst til en klient, bliver netværket og klienten en væsentlig faktor i den forløbne tid, ikke kun SELECT , sig selv.



  1. MySQL regexp på indekser

  2. Fuldtekst søgerelevans måles i?

  3. Sådan opretter du en MySQL-database ved hjælp af kommandolinjegrænsefladen (CLI)

  4. Hvordan genererer man en GUID i Oracle?