Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk menyelesaikan masalah pengubahsuaian medan perlahan dalam jadual besar MYSQL

Bagaimana untuk menyelesaikan masalah pengubahsuaian medan perlahan dalam jadual besar MYSQL

WBOY
WBOYke hadapan
2023-05-26 11:11:502414semak imbas

Untuk jadual besar, prestasi operasi ALTER TABLE MYSQL akan menjadi cabaran yang ketara. Cara MYSQL melaksanakan kebanyakan operasi pengubahsuaian struktur jadual adalah dengan mencipta jadual kosong dengan struktur jadual baharu, mendapatkan semula semua data daripada jadual lama, memasukkannya ke dalam jadual baharu, dan kemudian memadamkan jadual lama. Operasi ini boleh memakan masa yang lama jika memori tidak mencukupi dan jadualnya besar dan mempunyai banyak indeks. Operasi ALTER TABLE selalunya mengambil masa berjam-jam atau bahkan berhari-hari untuk disiapkan, yang merupakan situasi yang dialami ramai orang.

Biasanya, kebanyakan operasi ALTER TABLE akan menghentikan perkhidmatan MYSQL. Untuk senario biasa, hanya terdapat dua teknik yang boleh digunakan:

  • Salah satunya ialah melakukan operasi ALTER TABLE pada mesin yang tidak menyediakan perkhidmatan, dan kemudian berkomunikasi dengan utama. perpustakaan yang menyediakan perkhidmatan Switch;

  • Teknik lain ialah "salinan bayangan". Teknik penyalinan bayangan melibatkan proses mencipta jadual baharu dan beroperasi pada struktur jadual yang diingini, dan kemudian menukar dua jadual melalui nama semula dan operasi jadual lepas.

Bukan semua operasi ALTER TABLE akan menyebabkan pembinaan semula jadual. Terdapat dua cara berbeza untuk menukar atau mengalih keluar nilai lalai lajur, satu daripadanya pantas dan satu lagi lebih perlahan.

Andaikan anda ingin menukar tempoh sewa lalai filem daripada tiga hari kepada lima hari. Berikut adalah cara yang sangat perlahan:

mysql> ALTER TABLE film modify column rental_duration tinyint(3) not null default 5;

Bilangan operasi untuk 1000 bacaan dan 1000 sisipan boleh diperolehi daripada "SHOW STATUS". Dalam erti kata lain, ia menyalin keseluruhan jadual ke jadual baharu, termasuk jenis data lajur, saiz dan atribut nol.

Secara teorinya, MYSQL boleh melangkau langkah mencipta jadual baharu. Nilai lalai jadual disimpan dalam fail .frm, supaya fail itu boleh diedit terus tanpa mengubah suai jadual itu sendiri. Walaupun kaedah pengoptimuman ini boleh dilaksanakan, MYSQL tidak menggunakannya pada masa ini, jadi mengubah suai operasi lajur memerlukan membina semula jadual.

Kaedah lain ialah menukar nilai lalai lajur melalui operasi ALTER COLUMN;

mysql> ALTER TABLE film ALTER COLUMN rental_duration set DEFAULT 5;

Pernyataan ini akan mengubah suai fail .frm secara langsung tanpa melibatkan data jadual. Jadi operasi ini sangat pantas.

Hanya ubah suai fail .frm

Walaupun sangat pantas untuk mengubah suai fail .frm jadual, MySQL kadangkala membina semula jadual tanpa perlu. Dengan mengambil sedikit risiko, MYSQL boleh dibenarkan membuat jenis pengubahsuaian lain tanpa membina semula jadual.

Nota Teknik yang ditunjukkan di bawah tidak disokong atau didokumenkan secara rasmi, dan mungkin tidak berfungsi dengan betul Gunakan teknik ini atas risiko anda sendiri. >Adalah disyorkan untuk membuat sandaran data sebelum melaksanakan!

Operasi berikut mungkin tidak memerlukan pembinaan semula jadual:

  • Alih keluar (bukan tambah) atribut AUTO_INCREMENT lajur.

  • Tambah, alih keluar atau tukar ENUM dan SET sentiasa hidup. Jika anda memadamkan nilai malar yang telah digunakan dalam satu baris, pertanyaan akan mengembalikan rentetan kosong.

Langkah:

  • Buat jadual kosong dengan struktur yang sama dan buat pengubahsuaian yang diperlukan (contohnya: tambah pemalar ENUM).

  • Laksanakan FLUSH TABLES DENGAN READ LOCK. Ini akan menutup semua jadual yang sedang digunakan dan menghalang sebarang jadual daripada dibuka.

  • Tukar fail .frm.

  • Laksanakan UNLOCK TABLES untuk melepaskan kunci baca dalam langkah kedua.

Berikut ialah contoh penambahan pemalar pada lajur penarafan jadual filem. Lajur semasa kelihatan seperti ini:

mysql> SHOW COLUMNS FROM film LIKE 'rating';
Field Type Null Key Default Extra
rating enum('G','PG','PG-13','R','NC-17') YES
G

Andaikan kita perlu menambah rating filem PG-14 untuk ibu bapa yang lebih berhati-hati tentang filem:

mysql> CREATE TABLE film_new like film;
mysql> ALTER TABLE film_new modify column rating ENUM('G','PG','PG-13','R','NC-17','PG-14') DEFAULT 'G';
mysql> FLUSH TABLES WITH READ LOCK;

Perhatikan bahawa kita berada dalam keadaan berterusan Menambah nilai baharu pada penghujung senarai. Jika anda meletakkan nilai baharu di tengah, contohnya: selepas PG-13, makna data sedia ada akan ditukar: nilai R sedia ada akan menjadi PG-14, dan NC-17 sedia ada akan menjadi R, tunggu.

Seterusnya, gunakan perintah sistem pengendalian untuk menukar fail .frm:

/var/lib/mysql/sakila# mv film.frm film_tmp.frm
/var/lib/mysql/sakila# mv film_new.frm film.frm
/var/lib/mysql/sakila# mv film_tmp.frm film_new.frm

Kembali ke baris arahan Mysql Kini anda boleh membuka kunci jadual dan melihat kesan perubahan:

mysql> UNLOCK TABLES;
mysql> SHOW COLUMNS FROM film like 'rating'\G

****************** 1. baris************************

Bidang: rating
Jenis: enum('G','PG','PG-13','R','NC-17','PG-14')

Perkara terakhir yang perlu anda lakukan ialah memadamkan jadual tambahan yang dibuat untuk melengkapkan operasi ini:

mysql> DROP TABLE film_new;

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan masalah pengubahsuaian medan perlahan dalam jadual besar MYSQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam