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
May 03, 2012
:Wat sneller is, InnoDB of MijnISAM?Sep 20, 2011
:Het beste van MyISAM en InnoDBMay 10, 2011
:Wat is de prestatie-impact van het gebruik van CHAR versus VARCHAR op een veld met een vaste grootte?
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.