De oplysninger, du har i spørgsmålet om MyISAM, er lige i mål. Jeg vil dog gerne besvare dine to yderligere spørgsmål:
SENESTE SPØRGSMÅL
Ifølge bogen
Kapitel 10:"Lagringsmotorer" Side 196 Afsnit 7 siger
Baseret på dette afsnit bliver den gamle post kun overskrevet med koblingsdata, hvis de nye data, der skal indsættes, ikke kan passe ind i den tidligere allokerede blok. Dette kan resultere i mange oppustede rækker.
YDERLIGERE SPØRGSMÅL
Fra mit tidligere svar ville der være masser af blokke, der har
- rumsblok
- længden af posten
- antallet af ubrugte bytes i blokken
- NULL-værdiindikatorflag
- muligvis en pegepind til postens fortsættelse, hvis posten ikke passede ind i det tidligere oprettede rum og skulle opdeles
Sådanne registreringslinks vil starte forrest i hver række, hvor der er indsat overdimensionerede data. Dette kan svulme op i en MyISAM-tabeller .MYD
fil meget hurtigt.
FORSLAG
Standardrækkeformatet for en MyISAM er dynamisk. Når en tabel er dynamisk og oplever mange INSERTs, UPDATEs og DELETEs, skal en sådan tabel optimeres med
OPTIMIZE TABLE mytable;
Der er et alternativ:Skift tabellens rækkeformat til Fixed. På den måde har alle rækker samme størrelse. Sådan laver du rækkeformatet Fixed:
ALTER TABLE mytable ROW_FORMAT=Fixed;
Selv med et fast rækkeformat skal der tages tid at lokalisere en tilgængelig post, men tiden ville være O(1) søgetid (i lægmandssprog ville det tage samme tid at finde en tilgængelig post, uanset hvor mange rækker tabellen har eller hvor mange slettede rækker der er). Du kan omgå dette trin ved at aktivere samtidig_indsæt som følger:
Tilføj dette til my.cnf
[mysqld]
concurrent_insert = 2
MySQL genstart ikke påkrævet. Bare løb
mysql> SET GLOBAL concurrent_insert = 2;
Dette ville få alle INSERT til at gå bagerst i bordet uden at lede efter ledig plads.
Fordel ved tabeller med faste rækker
- INSERT, UPDATES og DELETEs ville være noget hurtigere
- SELECT er 20-25 % hurtigere
Her er nogle af mine indlæg om, at SELECT er hurtigere for rækkeformater, der bliver rettet
May 03, 2012
:Hvilket er hurtigere, InnoDB eller MyISAM?Sep 20, 2011
:Bedst fra MyISAM og InnoDBMay 10, 2011
:Hvad er ydeevnepåvirkningen af at bruge CHAR vs. VARCHAR på et felt med fast størrelse?
Ulempe ved tabeller med faste rækker
I de fleste tilfælde, når du kører ALTER TABLE mytable ROW_FORMAT=Fixed;
, kan tabellen vokse 80-100%. .MYI
fil (indekssider for MyISAM-tabellen) ville også vokse med samme hastighed.
EPILOG
Hvis du vil have hastighed til MyISAM-tabeller og kan leve med større borde, ville mine alternative forslag være nødvendige. Hvis du vil spare plads til hver MyISAM-tabel, skal du lade rækkeformatet være som det er (dynamisk). Du bliver nødt til at komprimere tabellen med OPTIMIZE TABLE mytable;
hyppigere med dynamiske tabeller.