Apa yang menyebabkan TRUNCATE TABLE memakan waktu sangat lama?

9

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 TABLEperintah 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 TABLEselesai, semuanya kembali normal.

Saya tahu bahwa salah satu budak tidak menerima bacaan saat melakukan TRUNCATE TABLEkarena 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?

Ran
sumber
Apakah ada partisi di atas meja?
Barbaros Alp

Jawaban:

8

Penggunaan TRUNCATE TABLEpada 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 menahan user_engagements, yang berpotensi menahan TRUNCATE TABLEjuga.

Anda bisa mengganti nama tabel sehingga segera tersedia

SET FOREIGN_KEY_CHECKS = 0;
CREATE TABLE user_engagements_new LIKE user_engagements;
ALTER TABLE user_engagements RENAME user_engagements_zap;
ALTER TABLE user_engagements_new RENAME user_engagements;
DROP TABLE user_engagements_zap;
SET FOREIGN_KEY_CHECKS = 1;

Ini harus direplikasi dengan cepat kecuali untuk pernyataan terakhir.

Cobalah !!!

Jika Anda memiliki MySQL 5.1.16+, TRUNCATE TABLEmemerlukan hak DROP . Jawaban saya melakukan apa yang TRUNCATE TABLEsekarang.

Jika Anda memiliki MySQL 5.1.15 dan kembali, Anda memerlukan hak istimewa DELETE , yang mencakup jawaban saya.

RolandoMySQLDBA
sumber
2
Saya akan menggunakan pernyataan multi-bagian RENAME TABLEalih-alih ALTER TABLEuntuk membuat penggantian nama atom: RENAME TABLE user_engagements TO user_engagements_zap, user_engagements_new TO user_engagements; Pertimbangan lain adalah yang DROP TABLEmenyebabkan LRU_mutex dikunci saat daftar LRU dipindai dan setiap entri dihapus - ini akan membuat server Anda terhenti. Percona Server harus innodb_lazy_drop_tablemembantu dengan ini, tetapi DROP TABLEmasih bisa memakan waktu lama pada sistem file ext.
Aaron Brown
mungkinkah itu truncate tablemengambil banyak waktu karena partisi pada tabel (1000), saya dapat menghapusnya jika itu akan mengarah ke solusi?
Berlari