Mysql
 sql >> Baza danych >  >> RDS >> Mysql

ALTER TABLE w MySQL:przyjaciel czy wróg?

Instrukcja ALTER TABLE jest jedną z najczęściej używanych instrukcji w świecie MySQL - instrukcja pozwala dodawać, usuwać lub modyfikować kolumny w tabeli. W tym poście na blogu postaramy się dokładniej przyjrzeć, co to jest, co robi i kiedy należy go używać.

Co to jest ALTER TABLE i do czego służy?

Jak już wspomniano powyżej, instrukcja ALTER TABLE umożliwia administratorom baz danych i programistom dodawanie, usuwanie lub modyfikowanie kolumn w tabeli. Po prostu ALTER TABLE zmienia strukturę tabeli - pozwala dodawać, usuwać kolumny, dodawać lub usuwać indeksy, zmieniać nazwy kolumn lub zmieniać ich typ.

Kiedy i jak używać ALTER TABLE?

Do korzystania z ALTER TABLE potrzebne są na ogół uprawnienia ALTER, CREATE i INSERT. Aby zmienić nazwę tabeli, wymagane są uprawnienia ALTER i DROP dla starej tabeli, a następnie uprawnienia CREATE, ALTER i INSERT dla nowej tabeli, która ma zostać utworzona. Aby przypisać wymagane uprawnienia określonemu użytkownikowi, możesz użyć następującego zapytania:

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

Zastąp bazę danych nazwą swojej bazy danych, symbol wieloznaczny nazwą tabeli, jeśli chcesz, aby uprawnienia miały zastosowanie tylko do określonych tabel (symbol wieloznaczny sprawia, że ​​uprawnienie ma zastosowanie do wszystkich tabel) i użytkownik demo nazwą Twój użytkownik. Jeśli chcesz, aby uprawnienia były używane we wszystkich bazach danych i we wszystkich zawartych w nich tabelach, po prostu zastąp bazę danych symbolem wieloznacznym:

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

Aby faktycznie skorzystać z instrukcji ALTER TABLE, uruchom zapytanie zmieniające strukturę tabeli - ALTER TABLE służy do dodawania, usuwania lub modyfikowania kolumn w tabeli:zapytanie może również służy do dodawania indeksów do kolumn. Oto kilka podstawowych przykładów najczęściej używanych zapytań:

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

jego zapytanie spowoduje dodanie kolumny nazwa_kolumny do tabeli demo_table. Dodaj FIRST na końcu zapytania, aby kolumna była pierwszą kolumną w tabeli.

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

jego zapytanie doda kolumnę column_2 po kolumnie column_1 w tabeli demo_table.

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

To zapytanie doda wygenerowaną kolumnę do tabeli.

ALTER TABLE demo_table DROP COLUMN demo_column; 

To zapytanie spowodowałoby usunięcie kolumny demo_column w tabeli demo_table.

ALTER TABLE demo_table ADD INDEX demo_index(demo_column); 

To zapytanie doda indeks o nazwie demo_index (można wybrać nazwy) w kolumnie o nazwie demo_column w tabeli o nazwie demo_table.

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

To zapytanie doda indeks do kolumny demo_column i unikalny indeks do kolumny demo_unique.

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

To zapytanie zmieniłoby domyślny zestaw znaków określonej kolumny.

ALTER TABLE demo_table CONVERT TO CHARACTER SET charset_name; 

To zapytanie zmieniłoby domyślny zestaw znaków tabeli i wszystkich kolumn znakowych (CHAR, VARCHAR i TEXT).

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

To zapytanie podzieliłoby kolumnę demo_column na 8 partycji przez hash.

ALTER TABLE demo_table TABLESPACE tablespace_1 STORAGE DISK; 

To zapytanie przekonwertuje tabelę demo_table na pamięć dyskową.

Jeśli dodajesz indeksy, pamiętaj, że możesz dodać różne typy indeksów (na przykład indeks BTREE lub indeks FULLTEXT), możesz również dodać indeks, który obejmuje tylko określoną ilość znaków w kolumnie z zapytaniem takim jak:

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

Powyższe zapytanie doda indeks o nazwie demo_index do pierwszych 10 znaków kolumny o nazwie nazwa_kolumny w tabeli o nazwie demo_table.

Indeksy w MySQL to złożona bestia i naprawdę zasługują na osobny temat, więc nie będziemy tu wchodzić w szczegóły, ale jeśli chcesz dowiedzieć się więcej, nasz wcześniejszy post o indeksach MySQL powinien dostarczyć trochę więcej informacji.

Jak działa ALTER TABLE?

ALTER TABLE w MySQL ma swoje własne subtelności. Od najnowszej wersji MySQL, czyli MySQL 8.0. Istnieją 3 algorytmy, które wpływają na to, jak ALTER TABLE wykonuje takie zmiany. Są to:

  • KOPIUJ

    • Operacje są wykonywane na kopii oryginalnej tabeli, a dane tabeli są kopiowane z oryginalnej tabeli do nowej tabeli wiersz po wierszu. W większości przypadków ten algorytm może być bardzo kosztowny pod względem wykorzystania zasobów, zwłaszcza w przypadku dużych i dużych tabel. Po wybraniu lub wybraniu tego algorytmu wszystkie współbieżne DML nie są dozwolone, dlatego wszelkie kolejne zapytania odwołujące się do tabeli, której dotyczy problem, będą musiały czekać lub umieszczać w kolejce na liście procesów. Są szanse, że Twoja baza danych utknie, jeśli połączenia zostaną wyczerpane.

  • WSTAW

    • Operacje unikają kopiowania danych tabeli, ale mogą odbudować tabelę na miejscu. Wyłączna blokada metadanych w tabeli może zostać na krótko zastosowana w fazie przygotowania i wykonywania operacji. Zazwyczaj obsługiwany jest współbieżny DML.

  • NATYCHMIAST

    • Operacje modyfikują tylko metadane w słowniku danych. Podczas przygotowywania i wykonywania tabeli nie są blokowane na wyłączność metadanych, a dane tabeli pozostają nienaruszone, dzięki czemu operacje są natychmiastowe. Jednoczesne DML jest dozwolone. (Wprowadzony w MySQL 8.0.12)

Proces ALTER TABLE w MySQL może nie stanowić problemu w przypadku mniejszych tabel, ale jeśli Twój zestaw danych jest większy, możesz napotkać problemy — wiele osób doświadczyło zapytań ALTER TABLE, które zajęły godziny, dni, a nawet tygodnie ukończyć. W większości przypadków dzieje się tak z powodu opisanego powyżej procesu zmiany tabeli MySQL. Istnieje jednak sposób, aby przynajmniej nieznacznie skrócić czas zakończenia zapytania:

  1. Utwórz nową tabelę, taką jak tabela źródłowa, z wybraną strukturą, uruchamiając
    CREATE TABLE demo_table_new LIKE demo_table;
    następnie dostosowując jego strukturę. W tym przypadku demo_table jest tabelą źródłową, a demo_table_new jest nową tabelą.
  2. Wstaw dane do nowej tabeli.
  3. Zmień nazwę starej tabeli na demo_table_old (dostosuj nazwę do swoich potrzeb).
  4. Zmień nazwę nowej tabeli na poprzednią nazwę starej tabeli.
  5. Na koniec skopiuj wiersze ze starej tabeli do nowej tabeli i, jeśli to konieczne, utwórz indeksy.

Chociaż powyższe kroki działają dobrze. Jednak w rzeczywistych scenariuszach, administratorzy baz danych lub programiści stosują lean, aby użyć zmiany schematu pt-online firmy Percona lub skorzystać z ducha Github. Możesz rzucić okiem na nasz poprzedni post Top Open Source Tools for MySQL &MariaDB Migrations, który zawiera przegląd tych narzędzi do zmiany schematu.

W każdym razie to, co opisaliśmy powyżej, jest często nazywane podejściem „kopii w cieniu”:w istocie tworzysz nową tabelę o pożądanej strukturze, a następnie zmieniasz nazwę i upuszczasz, aby zamienić dwie tabele . Jest też inny sposób:możesz także zamienić serwery i uruchomić ALTER TABLE na serwerach, które nie są w produkcji. W przypadku MyISAM możesz WYŁĄCZYĆ KLUCZE, załadować dane, a następnie WŁĄCZYĆ KLUCZE.

ALTER TABLE Gotcha

Jeśli używasz instrukcji ALTER TABLE do tworzenia indeksów (możesz również użyć instrukcji CREATE INDEX), zaleca się tworzenie indeksów po wstawieniu danych, ponieważ jest to dość dobrze znany sposób na przyspieszenie przetwarzanie nie tylko w MySQL, ale także w innych systemach zarządzania bazami danych, takich jak Oracle. Ogólnie jednak należy pamiętać, że większość operacji ALTER TABLE powinna powodować pewne problemy (przerwy w działaniu) w MySQL.

Istnieje również inny sposób na przyspieszenie całego procesu, choć jest on nieco bardziej zaawansowany:jeśli możesz przekonać MySQL, aby tylko modyfikował plik .frm tabeli (pliki .frm opisują definicję stół) i zostaw stół w spokoju, proces będzie szybszy:

  1. Utwórz pustą tabelę o takim samym układzie jak stara tabela bez jej modyfikowania.
  2. Zamknij wszystkie używane tabele i zapobiegnij otwieraniu wszystkich nowych tabel, uruchamiając 
    FLUSH TABLES WITH READ LOCK.
  3. Zamień pliki .frm.
  4. Zwolnij blokadę odczytu, uruchamiając UNLOCK TABLES.

Pamiętaj również, że jeśli chcesz zmodyfikować kolumnę, a składnia wydaje się poprawna, ale nadal pojawia się błąd, być może nadszedł czas, aby przyjrzeć się innej składni. Na przykład:

ALTER TABLE demo_table ADD long VARCHAR(255); 

W takim zapytaniu wystąpiłby błąd, ponieważ long jest słowem zastrzeżonym. Aby uniknąć takiego błędu, pomiń słowo za pomocą backticków:

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

Warto również zauważyć, że nazwy kolumn mogą być zmieniane tylko za pomocą backticków, a nie pojedynczych lub podwójnych cudzysłowów. Na przykład, zapytanie takie jak to również wyjdzie z błędem:

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

Podsumowanie

MySQL używa instrukcji ALTER TABLE do dodawania, usuwania lub modyfikowania kolumn w tabeli. Aby instrukcja została pomyślnie wykonana, musisz mieć uprawnienia ALTER, CREATE i INSERT do tabeli. Stwierdzenie ma również kilka charakterystycznych dla siebie subtelności:jego wydajność może ucierpieć, gdy działa na bardzo dużych stołach ze względu na sposób, w jaki działa, ale dopóki wiesz, jak działa i co robi, powinieneś być w porządku.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Warunkowe wstawianie MySQL

  2. Znajdź wartości, które nie zawierają liczb w MySQL

  3. Jak dodać opcję do sql_mode w MySQL bez utraty istniejących ustawień?

  4. Mysql:Zamów według polubienia?

  5. Klasy zagnieżdżone — CustomRowMapper !! To już nie problem!! - Część 2