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

Náhodný PRIMÁRNÍ KLÍČ pro Innodb

MySQL „nepřestavuje“ index na každém vložení.

Výchozí velikost stránky MySQL je 16 kB. Tyto stránky přiděluje v krocích po 1 MB (nazývané rozsahy).

Když je tabulka poprvé vytvořena (indexy jsou přestavěny), stránky jsou zaplněny z 15/16, přičemž je ponechán prostor pro některé náhodné vložky (1k místnosti). Pokud mají vaše položky indexu každý 500 bajtů (velikost primárního klíče + data řádku pro seskupený index), ponechává prostor pro vložení 2 nových řádků, než budete muset stránku rozdělit.

MySQL uchovává hodnotu nejvyššího a nejnižšího záznamu v záhlaví stránky, takže záznamy v určitém rozsahu jdou na stejnou stránku.

Když MySQL potřebuje vložit řádek na celou stránku, musí být stránka rozdělena. MySQL přidá novou stránku a přesune polovinu dat stránky na novou stránku.

Na stránce nemusí být záznamy ve skutečnosti ve fyzickém pořadí. Budou v pořadí, v jakém byly vloženy. Jsou propojeny v pořadí prostřednictvím formuláře propojeného seznamu. Takže ani náhodné vložení, kromě potřeby rozdělit stránku, nezpůsobí fyzický přesun dat.

Po mnoha náhodných vloženích budou vaše stránky plné z 1/2 na plné. Index s mnoha polovičními stránkami negativně ovlivní výkon čtení (abyste přečetli stejný počet záznamů jako jedna 15/16 plná stránka, musíte přečíst dvě plné stránky).

Nyní, pokud vkládáte řádky v indexovém pořadí, pak MySQL jednoduše neustále přidává na konec stránek, zaplňuje je z 15/16 a přidává rozsah po stránkách. Mnohem menší penalizace za výkon, protože nedochází k dělení stránek, takže není nutné přesouvat data, nemluvě o výhodě výkonu při čtení téměř celých stránek.

Náhodné vkládání také zvyšuje fragmentaci stránek, což může ovlivnit výkon čtení, pokud často čtete velké množství sekvenčních záznamů (vzácné).

Také změnit ukládání do vyrovnávací paměti vás může ovlivnit.




  1. Proč se mi u mého PHP stále zobrazuje chyba 500?

  2. Jak použít pole hodnot z PHP v klauzuli 'IN' dotazu mysql?

  3. Spustit uloženou proceduru s parametrem Output?

  4. PDO + MySQL vždy vrací řetězce, ale co MsSQL?