Saya menjalankan MySQL5.5 dengan replikasi Master / Slave (1 master, 2 slave).
Saya memiliki proses yang berjalan seminggu sekali dan memotong tabel tertentu. Tabelnya tidak besar dan hanya memiliki beberapa ribu catatan.
Untuk beberapa alasan, TRUNCATE TABLE
perintah ini membutuhkan waktu sangat lama untuk dieksekusi (baik pada master dan pada slave). Perlu sekitar 400K ms untuk dijalankan !! Ketika dijalankan pada slave, itu menyebabkannya tertinggal dari Master. Setelah TRUNCATE TABLE
selesai, semuanya kembali normal.
Saya tahu bahwa salah satu budak tidak menerima bacaan saat melakukan TRUNCATE TABLE
karena itu adalah budak yang berdedikasi dan proses yang membaca dari budak itu turun. Juga, pada budak ini, dibutuhkan jumlah waktu yang sama untuk dieksekusi.
Berikut adalah struktur tabelnya: http://pastebin.com/qEQB4juR
Adakah pemikiran tentang bagaimana saya dapat mempercepat TRUNCATE TABLE?
Jawaban:
Penggunaan
TRUNCATE TABLE
pada tabel InnoDB membutuhkan kunci tabel penuh karena TRUNCATE TABLE adalah DDL (Data Definition Language) bukan DML (Manipulasi Data).Melakukan
DELETE FROM user_engagements;
tidak akan membantu karena info MVCC ditulis ke undo log di ibdata1, dan itu bisa menahan tabel agar tidak dikosongkan. Jika ada transaksi yang tidak berkomitmen menahanuser_engagements
, yang berpotensi menahanTRUNCATE TABLE
juga.Anda bisa mengganti nama tabel sehingga segera tersedia
Ini harus direplikasi dengan cepat kecuali untuk pernyataan terakhir.
Cobalah !!!
Jika Anda memiliki MySQL 5.1.16+,
TRUNCATE TABLE
memerlukan hak DROP . Jawaban saya melakukan apa yangTRUNCATE TABLE
sekarang.Jika Anda memiliki MySQL 5.1.15 dan kembali, Anda memerlukan hak istimewa DELETE , yang mencakup jawaban saya.
sumber
RENAME TABLE
alih-alihALTER TABLE
untuk membuat penggantian nama atom:RENAME TABLE user_engagements TO user_engagements_zap, user_engagements_new TO user_engagements;
Pertimbangan lain adalah yangDROP TABLE
menyebabkan LRU_mutex dikunci saat daftar LRU dipindai dan setiap entri dihapus - ini akan membuat server Anda terhenti. Percona Server harusinnodb_lazy_drop_table
membantu dengan ini, tetapiDROP TABLE
masih bisa memakan waktu lama pada sistem file ext.truncate table
mengambil banyak waktu karena partisi pada tabel (1000), saya dapat menghapusnya jika itu akan mengarah ke solusi?