sql >> Databáze >  >> RDS >> Mysql

Pochopení struktury záznamů MyISAM

Informace, které máte v otázce týkající se MyISAM, jsou správné. Rád bych však odpověděl na vaše dvě dodatečné otázky:

POSLEDNÍ OTÁZKA

Podle knihy

Kapitola 10:„Storage Engines“ Strana 196 Odstavec 7 říká

Na základě tohoto odstavce se starý záznam přepíše daty propojení pouze v případě, že se nová data, která se mají vložit, nevejdou do dříve přiděleného bloku. To může vést k mnoha nafouknutým řádkům.

DALŠÍ OTÁZKA

Z mé předchozí odpovědi by bylo mnoho bloků, které mají

  • blok prostoru
  • délka záznamu
  • počet nepoužitých bajtů v bloku
  • Příznaky indikátoru hodnoty NULL
  • případně ukazatel na pokračování záznamu, pokud se záznam nevešel do dříve vytvořeného prostoru a musel být rozdělen

Takové odkazy na záznamy by začínaly v popředí každého řádku, do kterého by se vkládala příliš velká data. To může nafouknout MyISAM tabulky .MYD soubor velmi rychle.

NÁVRHY

Výchozí formát řádků MyISAM je Dynamický. Když je tabulka dynamická a zaznamenává mnoho INSERTů, AKTUALIZACÍ a DELETE, bude třeba takovou tabulku optimalizovat pomocí

OPTIMIZE TABLE mytable;

Existuje alternativa:přepněte formát řádku tabulky na Pevný. Tímto způsobem budou mít všechny řádky stejnou velikost. Tímto způsobem nastavíte formát řádku na pevný:

ALTER TABLE mytable ROW_FORMAT=Fixed;

Dokonce i s pevným formátem řádků musí nalezení dostupného záznamu zabrat čas, ale čas by byl O(1) čas hledání (Laicky řečeno, nalezení dostupného záznamu by trvalo stejně dlouho bez ohledu na počet řádků tabulka má nebo kolik je smazaných řádků). Tento krok můžete obejít povolením concurrent_insert takto:

Přidejte toto do my.cnf

[mysqld]
concurrent_insert = 2

Restart MySQL není vyžadován. Stačí běž

mysql> SET GLOBAL concurrent_insert = 2;

To by způsobilo, že by se všechny INSERTy přesunuly na konec tabulky, aniž by hledaly volné místo.

Výhoda tabulek s pevnými řádky

  • VLOŽENÍ, AKTUALIZACE a DELETE by byly poněkud rychlejší
  • SELECT jsou o 20–25 % rychlejší

Zde jsou některé z mých příspěvků o tom, že SELECT je rychlejší pro Opravované formáty řádků

Nevýhoda tabulek s pevnými řádky

Ve většině případů, když spustíte ALTER TABLE mytable ROW_FORMAT=Fixed; , tabulka může růst o 80-100 %. .MYI soubor (stránky indexu pro tabulku MyISAM) by také rostl stejnou rychlostí.

EPILOG

Pokud chcete rychlost pro stoly MyISAM a dokážete žít s většími stoly, budou zapotřebí mé alternativní návrhy. Pokud chcete ušetřit místo pro každou tabulku MyISAM, ponechte formát řádků tak, jak je (Dynamický). Budete muset zkomprimovat tabulku pomocí OPTIMIZE TABLE mytable; častější u dynamických tabulek.




  1. Přidejte klauzule WHERE do SQL dynamicky / programově

  2. Výkon vícenásobného vkládání MySQL

  3. Jak získat poslední vložené ID?

  4. Může Django ORM provést ORDER BY na konkrétní hodnotě sloupce?