Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

ALTER TABLE di MySQL:Teman atau Musuh?

Pernyataan ALTER TABLE adalah salah satu pernyataan yang paling sering digunakan di dunia MySQL - pernyataan ini memungkinkan Anda untuk menambah, menghapus, atau memodifikasi kolom dalam sebuah tabel. Dalam posting blog ini kami akan mencoba melihat lebih dalam apa itu, apa fungsinya, dan kapan harus digunakan.

Apa itu ALTER TABLE dan Apa Fungsinya?

Seperti yang telah disebutkan di atas, pernyataan ALTER TABLE memungkinkan DBA dan pengembang untuk menambah, menghapus, atau memodifikasi kolom dalam tabel. Sederhananya ALTER TABLE mengubah struktur tabel - ini memungkinkan Anda untuk menambah, menghapus kolom, menambah atau menghapus indeks, mengganti nama kolom atau mengubah jenisnya.

Kapan dan Bagaimana Saya Menggunakan ALTER TABLE?

Untuk menggunakan ALTER TABLE, biasanya Anda memerlukan hak istimewa ALTER, CREATE, dan INSERT. Untuk mengganti nama tabel, hak istimewa yang diperlukan adalah ALTER dan DROP untuk tabel lama, lalu hak CREATE, ALTER dan INSERT untuk tabel baru yang akan dibuat. Untuk menetapkan hak istimewa yang diperlukan ke pengguna tertentu, Anda dapat menggunakan kueri berikut:

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

Ganti database dengan nama database Anda, wildcard dengan nama tabel jika Anda ingin hak istimewa hanya berlaku untuk tabel tertentu (wilcard membuat hak istimewa berlaku di semua tabel) dan demo_user dengan nama pengguna Anda. Jika Anda ingin hak istimewa digunakan di semua database dan semua tabel di dalamnya, cukup ganti database dengan wildcard:

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

Untuk benar-benar memanfaatkan pernyataan ALTER TABLE, jalankan kueri yang mengubah struktur tabel - ALTER TABLE digunakan untuk menambah, menghapus, atau mengubah kolom dalam tabel:kueri juga dapat digunakan untuk menambahkan indeks ke kolom. Berikut ini beberapa contoh dasar kueri yang paling sering digunakan:

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

kuerinya akan menambahkan kolom column_name ke tabel demo_table. Tambahkan PERTAMA ke akhir kueri untuk membuat kolom menjadi kolom pertama dalam tabel.

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

kuerinya akan menambahkan kolom column_2 setelah kolom column_1 pada tabel demo_table.

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

Kueri ini akan menambahkan kolom yang dihasilkan ke tabel.

ALTER TABLE demo_table DROP COLUMN demo_column; 

Kueri ini akan menghapus kolom demo_column pada tabel demo_table.

ALTER TABLE demo_table ADD INDEX demo_index(demo_column); 

Kueri ini akan menambahkan indeks bernama demo_index (nama dapat dipilih) pada kolom bernama demo_column dalam tabel bernama demo_table.

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

Kueri ini akan menambahkan indeks pada kolom demo_column dan indeks unik pada kolom demo_unique.

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

Kueri ini akan mengubah set karakter default kolom tertentu.

ALTER TABLE demo_table CONVERT TO CHARACTER SET charset_name; 

Kueri ini akan mengubah set karakter default tabel dan semua kolom karakter (CHAR, VARCHAR, dan TEXT).

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

Kueri ini akan mempartisi kolom demo_column menjadi 8 partisi dengan hash.

ALTER TABLE demo_table TABLESPACE tablespace_1 STORAGE DISK; 

Kueri ini akan mengonversi tabel demo_table ke penyimpanan berbasis disk.

Jika Anda menambahkan indeks, ingatlah bahwa Anda dapat menambahkan berbagai jenis indeks (misalnya, indeks BTREE atau indeks FULLTEXT), Anda juga dapat menambahkan indeks yang hanya mencakup jumlah tertentu karakter dalam kolom dengan kueri seperti ini:

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

Kueri di atas akan menambahkan indeks yang disebut demo_index pada 10 karakter pertama kolom yang disebut column_name dalam tabel bernama demo_table.

Indeks di MySQL adalah binatang yang kompleks dan mereka benar-benar layak mendapatkan topik mereka sendiri sehingga kami tidak akan membahas detailnya di sini, tetapi jika Anda ingin mempelajari lebih lanjut, posting kami sebelumnya tentang indeks MySQL harus menyediakan beberapa lebih banyak wawasan.

Bagaimana Cara Kerja ALTER TABLE?

ALTER TABLE di MySQL memiliki kehalusannya sendiri. Pada versi MySQL terbaru, yaitu MySQL 8.0. Ada 3 algoritme yang memengaruhi kinerja ALTER TABLE untuk perubahan tersebut. Ini adalah:

  • SALIN

    • Operasi dilakukan pada salinan tabel asli, dan data tabel disalin dari tabel asli ke tabel baru baris demi baris. Dalam kebanyakan kasus, algoritma ini bisa sangat mahal dalam hal penggunaan sumber daya terutama untuk tabel besar dan besar. Ketika algoritme ini dipilih atau dipilih, semua DML bersamaan tidak diizinkan sehingga setiap kueri berikutnya yang merujuk ke tabel yang terpengaruh harus menunggu atau diantrekan ke dalam daftar proses. Kemungkinan besar, database Anda akan macet jika koneksi sudah maksimal.

  • TEMPAT

    • Operasi menghindari penyalinan data tabel tetapi dapat membangun kembali tabel di tempatnya. Kunci metadata eksklusif di atas meja dapat diambil secara singkat selama fase persiapan dan pelaksanaan operasi. Biasanya, DML bersamaan didukung.

  • INSTAN

    • Operasi hanya mengubah metadata dalam kamus data. Tidak ada kunci metadata eksklusif yang diambil di atas meja selama persiapan dan eksekusi, dan data tabel tidak terpengaruh, membuat operasi seketika. DML bersamaan diizinkan. (Diperkenalkan di MySQL 8.0.12)

Proses ALTER TABLE MySQL mungkin tidak menjadi masalah dengan tabel yang lebih kecil, tetapi jika kumpulan data Anda lebih besar, Anda dapat mengalami masalah - banyak orang pernah mengalami kueri ALTER TABLE yang memakan waktu berjam-jam, berhari-hari, atau bahkan berminggu-minggu untuk menyelesaikan. Dalam kebanyakan kasus, itu terjadi karena proses perubahan tabel MySQL yang diuraikan di atas. Namun, ada cara untuk setidaknya sedikit mengurangi waktu yang diperlukan untuk menyelesaikan kueri:

  1. Buat tabel baru seperti tabel sumber dengan struktur yang diinginkan dengan menjalankan
    CREATE TABLE demo_table_new LIKE demo_table;
    kemudian menyesuaikan strukturnya. Dalam hal ini demo_table adalah tabel sumber dan demo_table_new adalah tabel baru.
  2. Sisipkan data ke dalam tabel baru.
  3. Ganti nama tabel lama menjadi demo_table_old (sesuaikan namanya dengan kebutuhan Anda).
  4. Ganti nama tabel baru menjadi nama lama tabel lama.
  5. Terakhir, salin baris dari tabel lama ke tabel baru dan, jika perlu, buat indeks.

Meskipun langkah-langkah di atas berfungsi dengan baik. Namun, dalam skenario kasus dunia nyata, DBA atau pengembang cenderung menggunakan pt-online-schema-change Percona atau menggunakan gh-ost Github. Anda dapat melihat postingan kami sebelumnya Alat Sumber Terbuka Teratas untuk Migrasi MySQL &MariaDB yang mengambil ikhtisar alat pengubah skema ini.

Bagaimanapun, apa yang telah kami jelaskan di atas sering dikenal sebagai pendekatan "salinan bayangan":pada dasarnya, Anda membangun tabel baru dengan struktur yang diinginkan, kemudian melakukan rename dan drop untuk menukar dua tabel . Ada juga cara lain:Anda juga dapat menukar server dan menjalankan ALTER TABLE di server yang tidak dalam produksi. Untuk MyISAM, Anda dapat MENONAKTIFKAN KUNCI, memuat data, lalu MENGAKTIFKAN KUNCI.

ALTER TABLE Gotcha

Jika Anda menggunakan pernyataan ALTER TABLE untuk membuat indeks (Anda juga dapat menggunakan pernyataan CREATE INDEX), disarankan untuk membuat indeks setelah memasukkan data karena itu cara yang cukup terkenal untuk mempercepat pemrosesan tidak hanya di MySQL, tetapi juga di sistem manajemen basis data lainnya, seperti Oracle. Namun secara umum, perlu diingat bahwa sebagian besar operasi ALTER TABLE diharapkan menyebabkan beberapa masalah (gangguan layanan) ke MySQL.

Ada juga cara lain untuk mempercepat seluruh proses, meskipun sedikit lebih maju:jika Anda dapat meyakinkan MySQL untuk hanya memodifikasi file .frm tabel (file .frm menjelaskan definisi dari meja) dan biarkan meja saja, prosesnya akan lebih cepat:

  1. Buat tabel kosong dengan tata letak yang sama dengan tabel lama tanpa mengubahnya.
  2. Tutup semua tabel yang digunakan dan cegah semua tabel baru dibuka dengan menjalankan 
    FLUSH TABLES WITH READ LOCK.
  3. Tukar file .frm.
  4. Lepaskan kunci baca dengan menjalankan UNLOCK TABLES.

Perlu diingat juga bahwa jika Anda ingin mengubah kolom dan sintaksnya tampak benar tetapi Anda masih mendapatkan kesalahan, mungkin sudah saatnya untuk melihat ke dalam sintaks yang berbeda. Misalnya:

ALTER TABLE demo_table ADD long VARCHAR(255); 

Kueri seperti ini akan error karena long adalah kata yang dicadangkan. Untuk menghindari kesalahan seperti itu, hindari kata dengan backticks:

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

Perlu diperhatikan juga bahwa nama kolom hanya dapat diloloskan menggunakan tanda kutip balik dan tidak dengan tanda kutip tunggal atau tanda kutip ganda. Misalnya, kueri seperti itu juga akan error:

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

Ringkasan

MySQL menggunakan pernyataan ALTER TABLE untuk menambah, menghapus atau memodifikasi kolom dalam sebuah tabel. Agar pernyataan berhasil dieksekusi, Anda harus memiliki hak ALTER, CREATE, dan INSERT untuk tabel. Pernyataan tersebut juga memiliki beberapa kehalusan yang unik untuk dirinya sendiri:kinerjanya dapat menurun saat dijalankan pada tabel yang sangat besar karena cara kerjanya, tetapi selama Anda mengetahui cara kerja pernyataan dan apa yang dilakukannya, Anda akan baik-baik saja.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apakah ada cara untuk memeriksa kinerja Pengindeksan mysql?

  2. Instal MySQL di Ubuntu 14.04

  3. MySQL - Memilih Kolom bukan di Grup By

  4. Cara Mengubah Detik ke Nilai Waktu di MySQL

  5. MySQL Trigger untuk mencegah INSERT dalam kondisi tertentu