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

ALTER TABLE v MySQL:Přítel nebo nepřítel?

Příkaz ALTER TABLE je jedním z nejčastěji používaných příkazů ve světě MySQL – příkaz umožňuje přidávat, mazat nebo upravovat sloupce v tabulce. V tomto příspěvku na blogu se pokusíme hlouběji prozkoumat, co to je, k čemu slouží a kdy by se měl používat.

Co je ALTER TABLE a co dělá?

Jak již bylo zmíněno výše, příkaz ALTER TABLE umožňuje správcům databází a vývojářům přidávat, odstraňovat nebo upravovat sloupce v tabulce. Jednoduše řečeno ALTER TABLE mění strukturu tabulky – umožňuje přidávat, odstraňovat sloupce, přidávat nebo odebírat indexy, přejmenovávat sloupce nebo měnit jejich typ.

Kdy a jak mohu použít ALTER TABLE?

Abyste mohli používat ALTER TABLE, obecně potřebujete oprávnění ALTER, CREATE a INSERT. Pro přejmenování tabulky jsou požadovaná oprávnění ALTER a DROP pro starou tabulku, poté oprávnění CREATE, ALTER a INSERT pro novou tabulku, která má být vytvořena. Chcete-li přiřadit požadovaná oprávnění určitému uživateli, můžete použít následující dotaz:

GRANT ALTER, CREATE, INSERT ON database.* TO 'demo_user';

Nahraďte databázi názvem vaší databáze, zástupný znak názvem tabulky, chcete-li, aby byla oprávnění použitelná pouze pro určité tabulky (zástupný znak umožňuje použití oprávnění ve všech tabulkách) a demo_user názvem vašeho uživatele. Pokud chcete, aby byla oprávnění použita ve všech databázích a ve všech tabulkách v nich, jednoduše nahraďte databázi zástupným znakem:

GRANT ALTER, CREATE, INSERT ON *.* TO 'demo_user';

Aby bylo možné skutečně využít příkaz ALTER TABLE, spusťte dotaz, který změní strukturu tabulky – ALTER TABLE se používá k přidání, odstranění nebo úpravě sloupců v tabulce:dotaz může také použít k přidání indexů do sloupců. Zde je několik základních příkladů nejčastěji používaných dotazů:

ALTER TABLE demo_table ADD column_name VARCHAR(255) NOT NULL DEFAULT ‘’; T

jeho dotaz by přidal sloupec název_sloupce do tabulky demo_table. Přidejte FIRST na konec dotazu, aby se sloupec stal prvním sloupcem v tabulce.

ALTER TABLE demo_table ADD column_2 VARCHAR(255) NOT NULL DEFAULT ‘’ AFTER column_1; T

jeho dotaz by přidal sloupec column_2 za sloupec column_1 v tabulce demo_table.

ALTER TABLE demo_table ADD COLUMN column_2 INT GENERATED ALWAYS AS (column_1 + 1) STORED; 

Tento dotaz by do tabulky přidal vygenerovaný sloupec.

ALTER TABLE demo_table DROP COLUMN demo_column; 

Tento dotaz by vypustil sloupec demo_column v tabulce demo_table.

ALTER TABLE demo_table ADD INDEX demo_index(demo_column); 

Tento dotaz by přidal index s názvem demo_index (názvy lze vybrat) do sloupce s názvem demo_column v tabulce s názvem demo_table.

ALTER TABLE demo_table ADD INDEX (demo_column), ADD UNIQUE (demo_unique); 

Tento dotaz by přidal index do sloupce demo_column a jedinečný index do sloupce demo_unique.

ALTER TABLE demo_table MODIFY column_name VARCHAR(255) CHARACTER SET utf8mb4; 

Tento dotaz by změnil výchozí znakovou sadu konkrétního sloupce.

ALTER TABLE demo_table CONVERT TO CHARACTER SET charset_name; 

Tento dotaz by změnil výchozí znakovou sadu tabulky a všechny znakové sloupce (CHAR, VARCHAR a TEXT).

ALTER TABLE demo_table PARTITION BY HASH(demo_column) PARTITIONS 8; 

Tento dotaz by rozdělil sloupec demo_column na 8 oddílů pomocí hash.

ALTER TABLE demo_table TABLESPACE tablespace_1 STORAGE DISK; 

Tento dotaz převede tabulku demo_table na diskové úložiště.

Pokud přidáváte indexy, mějte na paměti, že můžete přidat různé typy indexů (například index BTREE nebo FULLTEXTOVÝ index), můžete také přidat index, který pokrývá pouze určité množství znaků ve sloupci s dotazem, jako je tento:

ALTER TABLE demo_table ADD INDEX demo_index(column_name(10));

Výše uvedený dotaz by přidal index nazvaný demo_index na prvních 10 znaků sloupce s názvem column_name v tabulce s názvem demo_table.

Indexy v MySQL jsou složité zvíře a opravdu si zaslouží vlastní téma, takže zde nebudeme zabíhat do podrobností, ale pokud se chcete dozvědět více, náš dřívější příspěvek o indexech MySQL by měl poskytnout nějaké více informací.

Jak ALTER TABLE funguje?

ALTER TABLE v MySQL má své vlastní jemnosti. Od nejnovější verze MySQL, tedy MySQL 8.0. Existují 3 algoritmy, které ovlivňují, jak se ALTER TABLE chová při takových změnách. Jsou to:

  • KOPÍROVAT

    • Operace se provádějí s kopií původní tabulky a data tabulky se zkopírují z původní tabulky do nové tabulky řádek po řádku. Ve většině případů může být tento algoritmus velmi drahý z hlediska využití zdrojů, zejména u velkých a velkých tabulek. Když je vybrán nebo vybrán tento algoritmus, není povoleno veškeré souběžné DML, takže jakékoli následné dotazy odkazující na ovlivněnou tabulku budou muset čekat nebo se zařadit do seznamu procesů. Je pravděpodobné, že se vaše databáze zasekne, pokud se spojení vyčerpají.

  • VLOŽIT

    • Operace se vyhýbají kopírování dat tabulky, ale mohou tabulku znovu sestavit na místě. Exkluzivní zámek metadat na stole může být krátce pořízen během fáze přípravy a provádění operace. Obvykle je podporován souběžný jazyk DML.

  • OKAMŽITĚ

    • Operace pouze upravují metadata v datovém slovníku. Během přípravy a provádění nejsou na tabulku přijímány žádné exkluzivní zámky metadat a data tabulky nejsou ovlivněna, takže operace jsou okamžité. Souběžné DML je povoleno. (Zavedeno v MySQL 8.0.12)

Proces ALTER TABLE v MySQL nemusí být problém s menšími tabulkami, ale pokud je vaše datová sada větší, můžete narazit na problémy – mnoho lidí se setkalo s dotazy ALTER TABLE, které trvaly hodiny, dny nebo dokonce týdny dokončit. Ve většině případů k tomu dochází kvůli procesu změny tabulky MySQL popsanému výše. Existuje však způsob, jak alespoň mírně zkrátit dobu, kterou trvá dokončení dotazu:

  1. Vytvořte novou tabulku jako zdrojovou tabulku s požadovanou strukturou spuštěním
    CREATE TABLE demo_table_new LIKE demo_table;
    pak upravit jeho strukturu. V tomto případě je demo_table zdrojová tabulka a demo_table_new je nová tabulka.
  2. Vložte data do nové tabulky.
  3. Přejmenujte starou tabulku na demo_table_old (upravte název podle svých potřeb).
  4. Přejmenujte novou tabulku na původní název staré tabulky.
  5. Nakonec zkopírujte řádky ze staré tabulky do nové tabulky a v případě potřeby vytvořte indexy.

I když výše uvedené kroky fungují dobře. V reálných případech se však DBA nebo vývojáři rozhodnou využít Percona pt-online-schema-change nebo použití Github gh-ost. Můžete se podívat na náš předchozí příspěvek Nejlepší nástroje s otevřeným zdrojovým kódem pro migrace MySQL a MariaDB, který obsahuje přehled těchto nástrojů pro změnu schématu.

To, co jsme popsali výše, je každopádně často známé jako přístup „stínové kopie“:v podstatě vytvoříte novou tabulku s požadovanou strukturou, poté provedete přejmenování a přetažení, abyste obě tabulky prohodili. . Existuje také jiný způsob:můžete také vyměnit servery a spustit ALTER TABLE na serverech, které nejsou ve výrobě. Pro MyISAM můžete ZAKÁZAT KLÍČE, načíst data a poté POVOLIT KLÍČE.

ALTER TABLE Gotchas

Pokud k vytváření indexů používáte příkaz ALTER TABLE (můžete také použít příkaz CREATE INDEX), doporučuje se vytvářet indexy po vložení dat, protože to je docela dobře známý způsob urychlení zpracování nejen v MySQL, ale i v jiných systémech pro správu databází, jako je Oracle. Obecně však mějte na paměti, že většina operací ALTER TABLE by měla způsobit určité problémy (přerušení služby) MySQL.

Existuje také další způsob, jak celý proces urychlit, i když je o něco pokročilejší:pokud dokážete přesvědčit MySQL, aby upravila pouze soubor .frm tabulky (soubory .frm popisují definici stůl) a nechte stůl na pokoji, proces bude rychlejší:

  1. Vytvořte prázdnou tabulku se stejným rozložením jako stará tabulka, aniž byste ji upravovali.
  2. Zavřete všechny používané tabulky a zabraňte otevření všech nových tabulek spuštěním 
    FLUSH TABLES WITH READ LOCK.
  3. Vyměňte soubory .frm.
  4. Uvolněte zámek čtení spuštěním UNLOCK TABLES.

Mějte také na paměti, že pokud chcete upravit sloupec a syntaxe se zdá být správná, ale stále se zobrazuje chyba, možná je čas podívat se na jinou syntaxi. Například:

ALTER TABLE demo_table ADD long VARCHAR(255); 

Dotaz jako tento by byl chybný, protože long je vyhrazené slovo. Abyste se takové chybě vyhnuli, uzavřete slovo zpětným zaškrtnutím:

ALTER TABLE demo_table ADD `long` VARCHAR(255);

Za zmínku také stojí, že názvy sloupců lze escapovat pouze zpětným zaškrtnutím, nikoli jednoduchými nebo dvojitými uvozovkami. Například dotaz jako takový by také chyboval:

ALTER TABLE demo_table CHANGE COLUMN ‘demo_column’ ‘demo_column_2’ VARCHAR(255);

Shrnutí

MySQL používá příkaz ALTER TABLE k přidávání, odstraňování nebo úpravě sloupců v tabulce. Aby byl příkaz úspěšně proveden, musíte mít pro tabulku oprávnění ALTER, CREATE a INSERT. Příkaz má také několik jedinečných jemností:jeho výkon může utrpět při běhu na velmi velkých stolech kvůli způsobu, jakým funguje, ale pokud víte, jak příkaz funguje a co dělá, měli byste být v pořádku.


  1. Vše, co potřebujete vědět o SQL CTE na jednom místě

  2. Proč by podmínka IN byla pomalejší než =v sql?

  3. Co hledat, pokud vaše replikace MySQL zaostává

  4. Hranice slov PostgreSQL Regex?