sql >> Database >  >> RDS >> Mysql

Inzicht in de MyISAM-recordstructuur

De informatie die u heeft in de vraag over MyISAM is goed op weg. Ik wil echter graag uw twee aanvullende vragen beantwoorden:

LAATSTE VRAAG

Volgens het boek

Hoofdstuk 10:"Opslag-engines" Pagina 196 Paragraaf 7 zegt

Op basis van die alinea wordt het oude record alleen overschreven met koppelingsgegevens als de nieuwe in te voegen gegevens niet in het eerder toegewezen blok passen. Dit kan resulteren in veel opgeblazen rijen.

AANVULLENDE VRAAG

Uit mijn vorige antwoord zouden er veel blokken zijn die

  • ruimteblok
  • de lengte van het record
  • het aantal ongebruikte bytes in het blok
  • NULL-waarde-indicatorvlaggen
  • mogelijk een verwijzing naar het vervolg van het record als het record niet in de eerder gecreëerde ruimte paste en opgesplitst moest worden

Dergelijke recordkoppelingen zouden vooraan in elke rij beginnen met te grote gegevens die worden ingevoegd. Dit kan een MyISAM-tabellen opzwellen .MYD bestand zeer snel.

SUGGESTIES

De standaard rij-indeling van een MyISAM is Dynamisch. Wanneer een tabel dynamisch is en veel INSERT's, UPDATE's en DELETE's ervaart, zou een dergelijke tabel moeten worden geoptimaliseerd met

OPTIMIZE TABLE mytable;

Er is een alternatief:verander het rijformaat van de tabel naar Vast. Op die manier zijn alle rijen even groot. Zo maak je het rijformaat Fixed:

ALTER TABLE mytable ROW_FORMAT=Fixed;

Zelfs met een vast rijformaat moet er tijd worden genomen om een ​​beschikbaar record te vinden, maar de tijd zou O(1) zoektijd zijn (in lekentermen zou het dezelfde hoeveelheid tijd kosten om een ​​beschikbaar record te vinden, ongeacht hoeveel rijen de tabel heeft of hoeveel verwijderde rijen er zijn). U kunt die stap omzeilen door concurrent_insert als volgt:

Voeg dit toe aan my.cnf

[mysqld]
concurrent_insert = 2

Opnieuw opstarten van MySQL is niet vereist. Gewoon rennen

mysql> SET GLOBAL concurrent_insert = 2;

Dit zou ertoe leiden dat alle INSERT's naar de achterkant van de tafel gaan zonder op zoek te gaan naar vrije ruimte.

Voordeel van tabellen met vaste rijen

  • INSERT's, UPDATE's en DELETE's zouden iets sneller zijn
  • SELECT zijn 20-25% sneller

Hier zijn enkele van mijn berichten over het feit dat SELECT sneller is omdat rij-indelingen worden opgelost

Nadeel van tabellen met vaste rijen

In de meeste gevallen, wanneer u ALTER TABLE mytable ROW_FORMAT=Fixed; uitvoert , kan de tafel 80-100% groeien. De .MYI bestand (indexpagina's voor de MyISAM-tabel) zou ook in hetzelfde tempo groeien.

EPILOOG

Als je snelheid wilt voor MyISAM-tafels en met grotere tafels kunt leven, zijn mijn alternatieve suggesties nodig. Als u ruimte wilt besparen voor elke MyISAM-tabel, laat u de rijindeling ongewijzigd (Dynamisch). Je zult de tabel moeten comprimeren met OPTIMIZE TABLE mytable; vaker met dynamische tabellen.




  1. SQL SELECTEER MIN

  2. Minuten aftrekken van een datetime-waarde in MariaDB

  3. Hoe LocalTime() werkt in PostgreSQL

  4. Gebruik Single Row Query met MySQL en PHP