sql >> Databasteknik >  >> RDS >> Mysql

Förstå MyISAM-poststrukturen

Informationen du har i frågan om MyISAM är rätt i mål. Jag skulle dock vilja ta upp dina två ytterligare frågor:

SENASTE FRÅGA

Enligt boken

Kapitel 10:"Lagringsmotorer" Sida 196 Punkt 7 säger

Baserat på det stycket skrivs den gamla posten över med länkdata endast om den nya datan som ska infogas inte får plats i det tidigare allokerade blocket. Detta kan resultera i många uppsvällda rader.

YTTERLIGARE FRÅGA

Från mitt tidigare svar skulle det finnas massor av block som har

  • utrymmesblock
  • längden på posten
  • antalet oanvända byte i blocket
  • NULL-värdesindikatorflaggor
  • möjligen en pekare till postens fortsättning om posten inte passade in i det tidigare skapade utrymmet och måste delas upp

Sådana postlänkar skulle börja längst fram på varje rad som har överdimensionerade data som infogas. Detta kan blåsa upp en MyISAM-tabell .MYD fil mycket snabbt.

FÖRSLAG

Standardradformatet för en MyISAM är Dynamic. När en tabell är dynamisk och upplever många INSERT, UPDATES och DELETEs, skulle en sådan tabell behöva optimeras med

OPTIMIZE TABLE mytable;

Det finns ett alternativ:ändra tabellens radformat till Fast. På så sätt är alla rader lika stora. Så här gör du radformatet Fixed:

ALTER TABLE mytable ROW_FORMAT=Fixed;

Även med ett fast radformat måste det ta tid att hitta en tillgänglig post, men tiden skulle vara O(1) söktid (i lekmans termer skulle det ta lika lång tid att hitta en tillgänglig post oavsett hur många rader tabellen har eller hur många raderade rader det finns). Du kan kringgå det steget genom att aktivera concurrent_insert enligt följande:

Lägg till detta i my.cnf

[mysqld]
concurrent_insert = 2

MySQL-omstart krävs inte. Kör bara

mysql> SET GLOBAL concurrent_insert = 2;

Detta skulle få alla INSERT att gå till baksidan av tabellen utan att leta efter ledigt utrymme.

Fördel med tabeller med fasta rader

  • INSERT, UPDATES och DELETEs skulle vara något snabbare
  • SELECT är 20–25 % snabbare

Här är några av mina inlägg om att SELECT är snabbare för radformat som fixas

Nackdel med tabeller med fasta rader

I de flesta fall, när du kör ALTER TABLE mytable ROW_FORMAT=Fixed; , tabellen kan växa 80-100%. .MYI fil (indexsidor för MyISAM-tabellen) skulle också växa i samma takt.

EPILOG

Om du vill ha snabbhet för MyISAM-bord och kan leva med större bord, skulle mina alternativa förslag behövas. Om du vill spara utrymme för varje MyISAM-tabell, lämna radformatet som det är (Dynamiskt). Du måste komprimera tabellen med OPTIMIZE TABLE mytable; oftare med dynamiska tabeller.




  1. Hur man skapar en databas i SQL Server genom att använda TSQL eller GUI - SQL Server / TSQL Tutorial Del 24

  2. Finns det sätt att matcha IP med IP+CIDR ​​direkt från SELECT-frågan?

  3. Använder tidigare MySQL-datamapp på ny MySQL-installation

  4. mysql_data_seek pdo motsvarande