Mysql
 sql >> база данни >  >> RDS >> Mysql

ALTER TABLE в MySQL:Приятел или враг?

Изразът ALTER TABLE е един от най-често използваните изрази в света на MySQL - операторът ви позволява да добавяте, изтривате или променяте колони в таблица. В тази публикация в блога ще се опитаме да разгледаме по-задълбочено какво представлява, какво прави и кога трябва да се използва.

Какво е ALTER TABLE и какво прави?

Както вече беше споменато по-горе, операторът ALTER TABLE позволява на администраторите на база данни и разработчиците да добавят, изтриват или променят колони в таблица. Просто казано ALTER TABLE променя структурата на таблицата – тя ви позволява да добавяте, изтривате колони, добавяте или премахвате индекси, преименувате колони или променяте техния тип.

Кога и как да използвам ALTER TABLE?

За да използвате ALTER TABLE обикновено се нуждаете от привилегиите ALTER, CREATE и INSERT. За преименуване на таблица, необходимите привилегии са ALTER и DROP за старата таблица, след това привилегии CREATE, ALTER и INSERT за новата таблица, която ще бъде създадена. За да присвоите необходимите привилегии на определен потребител, можете да използвате следната заявка:

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

Заменете базата данни с името на вашата база данни, заместващия знак с името на таблицата, ако желаете привилегиите да са приложими само за определени таблици (заместващият знак прави привилегията приложима за всички таблици) и demo_user с името на вашият потребител. Ако искате привилегиите да се използват във всички бази данни и всички таблици в тях, просто заменете базата данни с заместващ знак:

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

За да използвате действително израза ALTER TABLE, изпълнете заявка, която променя структурата на таблица - ALTER TABLE се използва за добавяне, изтриване или промяна на колони в таблица:заявката може също да се използва за добавяне на индекси към колони. Ето няколко основни примера за най-често използваните заявки:

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

заявката му ще добави колона column_name към таблица demo_table. Добавете FIRST в края на заявката, за да направите колоната първата колона в таблицата.

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

заявката му ще добави колона column_2 след колоната column_1 в таблица demo_table.

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

Тази заявка ще добави генерирана колона към таблицата.

ALTER TABLE demo_table DROP COLUMN demo_column; 

Тази заявка ще пусне колоната demo_column в таблица demo_table.

ALTER TABLE demo_table ADD INDEX demo_index(demo_column); 

Тази заявка ще добави индекс с име demo_index (имена могат да бъдат избрани) към колона, наречена demo_column, в таблица, наречена demo_table.

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

Тази заявка ще добави индекс към колона demo_column и уникален индекс към колоната demo_unique.

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

Тази заявка ще промени набора от знаци по подразбиране за конкретна колона.

ALTER TABLE demo_table CONVERT TO CHARACTER SET charset_name; 

Тази заявка ще промени набора от знаци по подразбиране на таблицата и всички колони от знаци (CHAR, VARCHAR и TEXT).

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

Тази заявка ще раздели колоната demo_column на 8 дяла по хеш.

ALTER TABLE demo_table TABLESPACE tablespace_1 STORAGE DISK; 

Тази заявка ще преобразува таблицата demo_table в дисково хранилище.

Ако добавяте индекси, имайте предвид, че можете да добавяте различни типове индекси (например индекс BTREE или индекс FULLTEXT), можете също да добавите индекс, който покрива само определено количество от знаци в колона със заявка, както следва:

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

Горената заявка ще добави индекс, наречен demo_index, към първите 10 знака от колоната, наречена column_name, в таблица, наречена demo_table.

Индексите в MySQL са сложен звяр и те наистина заслужават отделна тема, така че няма да навлизаме в подробности тук, но ако искате да научите повече, нашата по-ранна публикация за MySQL индексите трябва да предостави някои повече прозрение.

Как работи ALTER TABLE?

ALTER TABLE в MySQL има свои собствени тънкости. От най-новата версия на MySQL, т.е. MySQL 8.0. Има 3 алгоритма, които влияят върху това как ALTER TABLE се представя за такива промени. Това са:

  • КОПИРАНЕ

    • Операциите се извършват върху копие на оригиналната таблица и данните от таблицата се копират от оригиналната таблица в новата таблица ред по ред. В повечето случаи този алгоритъм може да бъде много скъп по отношение на използването на ресурси, особено за големи и големи таблици. Когато този алгоритъм е избран или избран, всички едновременни DML не са разрешени, така че всички последващи заявки, отнасящи се до засегнатата таблица, ще трябва да изчакат или да се поставят на опашка в списъка с процеси. Вероятно е вашата база данни да блокира, ако връзките са изчерпани.

  • ПОСТАВЕТЕ

    • Операциите избягват копирането на данни от таблицата, но могат да възстановят таблицата на място. Ексклузивно заключване на метаданни на таблицата може да бъде взето за кратко по време на фазите на подготовка и изпълнение на операцията. Обикновено се поддържа едновременен DML.

  • МОМЕНТАЛНО

    • Операциите променят само метаданните в речника на данните. По време на подготовката и изпълнението на таблицата не се вземат изключителни заключвания на метаданни, а данните от таблицата не се засягат, което прави операциите мигновени. Едновременният DML е разрешен. (Въведено в MySQL 8.0.12)

Процесът ALTER TABLE на MySQL може да не е проблем с по-малките таблици, но ако вашият набор от данни е по-голям, можете да срещнете проблеми - много хора са имали ALTER TABLE заявки, които са отнели часове, дни или дори седмици да завърши. В повечето случаи това се случва поради процеса на промяна на таблицата на MySQL, описан по-горе. Въпреки това, има начин поне малко да се намали времето, необходимо за изпълнение на заявката:

  1. Създайте нова таблица като вашата изходна таблица с желаната от вас структура, като изпълните
    CREATE TABLE demo_table_new LIKE demo_table;
    след това коригира структурата му. В този случай demo_table е изходната таблица, а demo_table_new е новата таблица.
  2. Вмъкнете данни в новата таблица.
  3. Преименувайте старата таблица на demo_table_old (коригирайте името според нуждите си).
  4. Преименувайте новата таблица на предишното име на старата таблица.
  5. Накрая копирайте редовете от старата таблица в новата таблица и, ако е необходимо, създайте индекси.

Въпреки че стъпките по-горе работят добре. И все пак, в реални сценарии, DBA или разработчиците се наклоняват да използват промяната на pt-online-schema-change на Percona или gh-ost на Github. Можете да разгледате предишната ни публикация Най-добри инструменти с отворен код за миграции на MySQL и MariaDB, която прави преглед на тези инструменти за промяна на схеми.

Както и да е, това, което описахме по-горе, често е известно като подход на „сенчево копие“:по същество създавате нова таблица с желаната структура, след което извършвате преименуване и пускане, за да размените двете таблици . Има и друг начин:можете също да разменяте сървъри и да стартирате ALTER TABLE на сървъри, които не са в производство. За MyISAM можете да ИЗКЛЮЧИТЕ КЛЮЧОВЕ, да заредите данни и след това да ВКЛЮЧИТЕ КЛЮЧОВЕ.

ALTER TABLE Разпознавам

Ако използвате оператора ALTER TABLE за създаване на индекси (можете да използвате и оператора CREATE INDEX), се препоръчва да създавате индекси след вмъкване на данните, защото това е доста добре познат начин за ускоряване обработка не само в MySQL, но и в други системи за управление на бази данни, като Oracle. Като цяло обаче, имайте предвид, че повечето операции ALTER TABLE трябва да се очаква да причинят някои проблеми (прекъсване на услугата) на MySQL.

Има и друг начин за ускоряване на целия процес, макар и малко по-напреднал:ако успеете да убедите MySQL да модифицира само .frm файла на таблицата (файловете .frm описват дефиницията на таблицата) и оставете масата на мира, процесът ще бъде по-бърз:

  1. Създайте празна таблица със същото оформление като старата таблица, без да я променяте.
  2. Затворете всички използвани таблици и предотвратите отварянето на всички нови таблици, като изпълните 
    FLUSH TABLES WITH READ LOCK.
  3. Разменете .frm файловете.
  4. Освободете заключването за четене, като стартирате UNLOCK TABLES.

Също така имайте предвид, че ако искате да промените колона и синтаксисът изглежда правилен, но все пак получавате грешка, може да е време да разгледате различен синтаксис. Например:

ALTER TABLE demo_table ADD long VARCHAR(255); 

Заявка като тази би излязла от грешка, защото long е запазена дума. За да избегнете такава грешка, избягайте от думата с отметки:

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

Също така си струва да се отбележи, че имената на колоните могат да бъдат екранирани само с помощта на обратни отметки, а не с единични или двойни кавички. Например, заявка като тази също би довела до грешка:

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

Резюме

MySQL използва израза ALTER TABLE за добавяне, изтриване или промяна на колони в таблица. За да може инструкцията да бъде изпълнена успешно, трябва да имате привилегиите ALTER,CREATE и INSERT за таблицата. Изявлението също има няколко уникални за себе си тънкости:неговата производителност може да пострада, когато работи на много големи таблици поради начина, по който работи, но стига да знаете как работи операторът и какво прави, трябва да сте добре.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да деактивирате стриктния режим на MySQL

  2. Как мога да се свържа с MySQL в Python 3 на Windows?

  3. Ръководство за разбиране на моделите за мащабиране на базата данни

  4. Задаване на стойности на колони като имена на колони в резултата от SQL заявката

  5. Колко реда в една база данни са ТВЪРДЕ МНОГО?