Saya perlu membuat indeks pada tabel MySQL ~ 5 juta baris. Ini adalah tabel produksi, dan saya takut akan semua blok lengkap jika saya menjalankan pernyataan CREATE INDEX ...
Apakah ada cara untuk membuat indeks itu tanpa memblokir sisipan dan seleksi?
Hanya ingin tahu saya belum berhenti, buat indeks, dan mulai ulang sistem saya!
mysql
indexing
production
alter-table
table-locking
malam hari
sumber
sumber
Jawaban:
[2017] Pembaruan: MySQL 5.6 memiliki dukungan untuk pembaruan indeks online
https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-operations.html#online-ddl-index-syntax-notes
[2015] Tabel yang diperbarui menunjukkan blok menulis di MySQL 5.5
Dari jawaban di atas:
Ini adalah **** FALSE **** (setidaknya untuk tabel MyISAM / InnoDB, yang digunakan oleh 99,999% orang di luar sana. Edisi Clustered berbeda.)
Melakukan operasi UPDATE di atas meja akan DIBLOKIR saat indeks sedang dibuat. MySQL benar-benar bodoh tentang ini (dan beberapa hal lainnya).
Skrip Tes:
Server Saya (InnoDB):
Output (perhatikan bagaimana operasi ke-6 memblokir ~ 400ms yang diperlukan untuk menyelesaikan pembaruan indeks):
Operasi baca Vs yang tidak memblokir (menukar komentar baris di skrip):
Memperbarui Skema MySQL tanpa waktu henti
Sejauh ini, hanya ada satu metode yang saya ketahui untuk memperbarui skema MySql dan tidak mengalami gangguan ketersediaan. Master melingkar:
Cara mudah untuk memperbarui skema ini bukan. Bisa diterapkan di lingkungan produksi yang serius; ya itu. Tolong, tolong, tolong, jika ada cara yang lebih mudah untuk menambahkan indeks ke tabel MySQL tanpa memblokir penulisan, beri tahu saya.
Googling membawa saya ke artikel ini yang menjelaskan teknik serupa. Lebih baik lagi, mereka menyarankan minum pada titik yang sama dalam proses (Perhatikan bahwa saya menulis jawaban saya sebelum membaca artikel)!
Pt-online-schema-change Percona
The Artikel saya terkait di atas berbicara tentang alat, pt-secara online-skema-perubahan , yang bekerja sebagai berikut:
Saya sendiri belum pernah mencoba alat tersebut. YMMV
RDS
Saya saat ini menggunakan MySQL melalui Amazon's RDS . Ini adalah layanan yang sangat bagus yang membungkus dan mengelola MySQL, memungkinkan Anda menambahkan replika baca baru dengan satu tombol dan secara transparan memutakhirkan basis data di seluruh perangkat keras SKU. Sangat nyaman. Anda tidak mendapatkan akses SUPER ke database, jadi Anda tidak dapat mengacaukan replikasi secara langsung (apakah ini berkah atau kutukan?). Namun, Anda dapat menggunakan Promosi Replika Baca untuk mengubah skema Anda pada budak hanya-baca, lalu promosikan budak tersebut menjadi master baru Anda. Trik yang persis sama seperti yang saya jelaskan di atas, hanya saja jauh lebih mudah untuk dieksekusi. Mereka masih tidak berbuat banyak untuk membantu Anda mengatasi masalah ini. Anda harus mengkonfigurasi ulang dan memulai ulang aplikasi Anda.
sumber
Seperti yang dijelaskan oleh posting blog ini ,
ALTER TABLE
mekanisme InnoDB telah sepenuhnya didesain ulang untuk MySQL 5.6.(Untuk gambaran umum eksklusif tentang topik ini, dokumentasi MySQL dapat memberikan bacaan sore hari.)
Untuk menambahkan indeks ke tabel tanpa kunci yang menghasilkan
UPDATE
/INSERT
, format pernyataan berikut dapat digunakan:sumber
Pembaruan MySQL 5.6 (Februari 2013): Anda sekarang dapat melakukan operasi baca dan tulis saat indeks sedang dibuat bahkan dengan tabel InnoDB - http://dev.mysql.com/doc/refman/5.6/en/innodb-create-index -overview.html
dan:
dari http://dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_fast_index_creation
sumber
pt-online-schema-change adalah cara yang harus dilakukan jika Anda benar-benar ingin memastikan bahwa migrasi tidak akan menurunkan situs.
Seperti yang saya tulis di komentar di atas, saya memiliki beberapa pengalaman dengan pt-online-schema-change dalam produksi. Kami memiliki tabel utama 20M + catatan dan master -> 2 budak replikasi hanya-baca. Saya telah melakukan setidaknya lusinan migrasi dengan pt-online-schema-change dari menambahkan kolom baru, mengubah charset, hingga menambahkan beberapa indeks. Kami juga melayani banyak lalu lintas selama waktu migrasi dan kami tidak mengalami gangguan apa pun. Tentu saja Anda harus menguji semua skrip dengan sangat teliti sebelum menjalankan produksi.
Saya mencoba menggabungkan perubahan menjadi 1 skrip sehingga pt-online-schema-change hanya perlu menyalin data satu kali. Dan berhati-hatilah dengan mengubah nama kolom karena Anda akan kehilangan data Anda. Namun, menambahkan indeks seharusnya baik-baik saja.
sumber
pt-online-schema-change
. Ini bagus, tetapi berlebihan untuk banyak situasi di mana kemampuan DDL online MySQL 5.6 + sudah berfungsi dengan baik. Ini juga memiliki batasan (seperti tidak bermain dengan baik dengan pemicu), dan menggandakan jumlah tulisan yang diperlukan per sisipan ke tabel asli saat perubahan skema sedang berlangsung. Ini akan membebani disk Anda secara signifikan lebih dari perubahan skema online biasa, dan dengan demikian berpotensi untuk "menurunkan situs Anda" dalam situasi di mana hanya menjalankan skema mengubah cara sederhana akan bekerja dengan baik.pt-online-schema-change
merupakan alat yang berguna, ada banyak situasi di mana DDL online biasa sama bagusnya dan sedikit yang lebih baik, jadi setiap rekomendasinya harus diingat dengan hati-hati daripada universal.