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

Rychlejší způsob, jak odstranit odpovídající řádky?

Smazání dat z InnoDB je nejdražší operace, kterou od něj můžete požadovat. Jak jste již zjistili, problém sám o sobě není – většina z nich bude stejně optimalizována pro stejný plán provádění.

I když může být těžké pochopit, proč jsou DELETE ve všech případech nejpomalejší, existuje poměrně jednoduché vysvětlení. InnoDB je transakční úložiště. To znamená, že pokud by byl váš dotaz v polovině přerušen, všechny záznamy by byly stále na místě, jako by se nic nestalo. Jakmile bude hotovo, vše zmizí ve stejném okamžiku. Během DELETE ostatní klienti připojující se k serveru uvidí záznamy, dokud nebude vaše DELETE dokončeno.

K dosažení tohoto cíle používá InnoDB techniku ​​zvanou MVCC (Multi Version Concurrency Control). To, co v podstatě dělá, je poskytnout každému připojení náhled na celou databázi, jaká byla, když začal první výpis transakce. K dosažení tohoto cíle může mít každý záznam v InnoDB interně více hodnot – jednu pro každý snímek. To je také důvod, proč počítání na InnoDB nějakou dobu trvá – záleží na stavu snímku, který v tu chvíli vidíte.

Pro vaši transakci DELETE bude každý záznam, který je identifikován podle podmínek vašeho dotazu, označen k odstranění. Vzhledem k tomu, že k datům mohou ve stejnou dobu přistupovat jiní klienti, nemůže je okamžitě odstranit z tabulky, protože musí vidět svůj příslušný snímek, aby byla zaručena atomičnost smazání.

Jakmile budou všechny záznamy označeny k odstranění, transakce je úspěšně potvrzena. A ani pak je nelze okamžitě odstranit ze skutečných datových stránek, dokud nebudou ukončeny všechny ostatní transakce, které pracovaly s hodnotou snímku před vaší transakcí DELETE.

Takže ve skutečnosti vaše 3 minuty nejsou ve skutečnosti tak pomalé, vezmeme-li v úvahu skutečnost, že všechny záznamy musí být upraveny, aby byly připraveny na odstranění způsobem bezpečným pro transakce. Pravděpodobně uslyšíte, jak váš pevný disk pracuje, zatímco příkaz běží. To je způsobeno přístupem ke všem řádkům. Chcete-li zlepšit výkon, můžete zkusit zvýšit velikost fondu vyrovnávací paměti InnoDB pro váš server a pokusit se omezit další přístup k databázi během SMAZÁNÍ, čímž se také sníží počet historických verzí, které musí InnoDB udržovat za record.S přídavnou pamětí může být InnoDB schopno načíst vaši tabulku (většinou) do paměti a vyhnout se nějaké době hledání disku.



  1. Chyba MySQL č. 121

  2. Deset běžných hrozeb pro kvalitu plánu provádění

  3. Jak zapíšu data z R do tabulek PostgreSQL s automaticky se zvyšujícím primárním klíčem?

  4. MySQL UDF sys_exec() nefunguje