sql >> Database >  >> RDS >> Mysql

Groot aantal kolommen, alles selecteren duurt een eeuwigheid

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 een TEXT . 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.



  1. ID voor automatisch verhogen toevoegen aan bestaande tabel?

  2. Count in where-clausule gebruiken:ongeldig gebruik van groepsfunctie

  3. Hoe mysqlcppconn.lib te koppelen aan een c++-project

  4. Is er een reden om niet voor elke query opgeslagen procedures te gebruiken?