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

Forståelse af MyISAM-poststruktur

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

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.




  1. fjern information fra mysql-tabellen, når brugeren lukker sin browser

  2. Sådan fungerer SQLite Trim()

  3. mysql efter indsæt trigger, som opdaterer en anden tabels kolonne

  4. Automatiseret test af opgraderingsprocessen til PostgreSQL