Apa cara yang baik untuk menambahkan KUNCI UTAMA ke tabel InnoDB besar?

8

Saya punya meja dengan sekitar 30 juta baris di MySQL 5.5 menggunakan mesin penyimpanan InnoDB. Tabel ini memiliki kunci asing yang tertaut ke tabel lain dengan sekitar 3 juta baris.

Saya ingin menambahkan kunci utama ke tabel yang lebih besar, tetapi saya tidak yakin bagaimana cara terbaik untuk melakukannya. Tidak ada kolom yang ada (atau kumpulan kolom) yang dapat saya gunakan untuk ini, jadi bagaimana saya harus melakukannya?

Saya telah melihat beberapa referensi ke ID rekaman InnoDB internal, tetapi belum menemukan apakah ini dapat diakses.

Kalau tidak, mungkin saya perlu membuang dan memuat kembali data, menambahkan id secara manual.

Terima kasih.

Wodin
sumber
Apakah mereka kombinasi tombol di tabel yang secara alami unik? Jika demikian, kunci utama multi-kolom mungkin masuk akal.
Justin Dearing
Sayangnya tidak ada kunci komposit yang memungkinkan. Kalau tidak, saya setuju itu masuk akal. Saya telah mengedit posting untuk mengklarifikasi bahwa ini tidak mungkin.
Wodin

Jawaban:

7

ini mungkin cara yang salah untuk melakukannya, tapi ..

Anda tidak bisa hanya mengubah struktur tabel,

tambahkan kolom kunci utama ke tabel

kemudian...

tulis skrip cepat untuk menelusuri seluruh tabel

menambahkan nilai autoincrementing ke kolom baru?

Patrick
sumber
2
Terima kasih untuk sarannya. Saya pikir saya harus menambahkan kolom sebagai non-primary-key dan kemudian mengonversinya menjadi primary key setelahnya, tetapi saya sebenarnya baru saja secara tidak sengaja menemukan saat menguji pada tabel kecil, yang menambahkan kolom AUTO_INCREMENT (sebagai kunci utama) secara otomatis mengisi id. Mengasumsikan itu hanya akan memberi saya kesalahan, jadi saya pikir itu jawabannya.
Wodin
jika basis datanya tinggi, Anda mungkin ingin menguji ini pada tabel nonkritis untuk memastikannya tidak menguncinya untuk waktu yang lama
Patrick
@ Patrick, terima kasih atas perhatiannya. Basis data saat ini tidak digunakan dan saya sepenuhnya berharap ini mengunci tabel untuk waktu yang lama.
Wodin
1
Saya lakukan ALTER TABLE blah ADD id INT NOT NULL AUTO_INCREMENT PRIMARY KEY;dan butuh 2 jam 18 menit :) Saya tidak mencoba menulis ke meja selama waktu itu, tetapi membaca bekerja dengan baik.
Wodin
1
@ Wodin wow, itu waktu yang lama untuk perintah tabel alter. senang itu berhasil untuk Anda.
Patrick
3

Inilah cara saya mendekati ini:

  1. Buat tabel baru dengan struktur yang diinginkan termasuk KUNCI UTAMA Anda dengan AUTO_INCREMENT dan mungkin satu bidang lain yang diindeks.
  2. Luangkan waktu henti untuk menghentikan semua lalu lintas.
  3. Konfirmasikan bahwa Anda memiliki cadangan data Anda yang sah.
  4. Salin semua baris Anda dari tabel yang ada ke tabel target dengan menggunakan AUTO INCREMENT untuk membuat id Anda. * mis. INSERT INTO target_table (col1, col2, dll) SELECT (col1, col2, dll) DARI origin_table; *
  5. Uji bahwa data dalam tabel baru akurat.
  6. RENAME tabel lama ke origin_table_BAK.
  7. RENAME target_table ke origin_table.
  8. Uji asap aplikasi Anda.
  9. Buka kembali lalu lintas.
  10. Setelah cadangan Anda berikutnya, jatuhkan origin_table_BAK.

* Catatan: Jika tabel asal adalah InnoDB, batasan kunci asing akan dipertahankan dan selamat dari penggantian nama. Jadi, Anda harus melakukan perubahan untuk memperbaiki itu.

randomx
sumber
3
Jika Anda perlu melakukannya secara langsung, lakukan langkah 6 dan 7 dalam satu RENAME tunggal, sehingga membuatnya menjadi atom. RENAME TABLE real_name TO old, new TO real_name;
Rick James