Saya memiliki tindak lanjut atas pertanyaan saya sebelumnya mengenai kecepatan impor dengan Inno-Tables (kejutan!).
Skenario
Saya mencoba mengimpor beberapa dump database * besar di mesin dev lokal saya dalam waktu yang wajar. Kami memiliki banyak KEY
lampiran pada tabel yang ternyata menjadi hambatan tetapi masih penting untuk sistem live kami.
Pendekatan saya setelah mengajukan pertanyaan di atas adalah menghapus KEY ...
pernyataan dari dump, import, dan menambahkan kembali kunci.
Namun saya sering menemukan diri saya mengedit dump saat ini untuk mengimpor secara lokal dan saya menemukan "komentar" lucu ini (The disable/enable keys
-lines)
--
-- Dumping data for table `monster`
--
LOCK TABLES `monster` WRITE;
/*!40000 ALTER TABLE `monster` DISABLE KEYS */;
INSERT … INSERT … INSERT
/*!40000 ALTER TABLE `monster` ENABLE KEYS */;
UNLOCK TABLES;
Tetapi sebenarnya "komentar" ini adalah Pernyataan MySql bersyarat
Itu adalah berita baru bagi saya, tetapi baiklah, mengingat bentuk outputnya, mysql --version
semuanya tampak baik bagi saya:
mysql Ver 14.14 Distrib 5.5.38, for debian-linux-gnu (x86_64) using readline 6.3
Apa yang saya asumsikan
Meja terkunci (baik, hanya saya di dev mashine). Kemudian kunci sebagaimana didefinisikan dalam skema tabel dinonaktifkan, data diimpor, kunci diaktifkan.
Jadi selama "penyisipan data" -fase seharusnya tidak ada waktu yang terbuang pada kunci melainkan diperiksa setelah semua data dimasukkan.
Saya akan berpikir ini adalah perilaku yang sama seperti jika saya menghapus semua- KEY 'foo' (foo)'
baris dari dump, impor dump dan jalankan skrip dengan ADD KEY 'foo' ...
setelahnya.
Apa yang saya amati.
Ini adalah cara yang lebih cepat untuk secara manual menghapus kunci, mengimpor dan menambahkan kembali kunci kemudian mengandalkan DISABLE KEYS
pernyataan bersyarat yang dibuat sayamysqldump
Pengeditan manual dump + impor mysql + menambahkan kunci = 15 + 8 + 8 ≈ 30 mnt
Impor mysql polos: menyerah, (Saya baru saja dibayar untuk 8 jam / hari> :))
Mau tidak mau saya berpikir saya kehilangan sesuatu yang sangat mendasar di sini (atau database mengganggu saya).
mysqldump --innodb-optimize-keys
dari Percona percona.com/doc/percona-server/5.5/management/... Jangka panjang: berhenti menggunakan mysqldump dan gunakan mydumper atau xtrabackup.Jawaban:
Anda tidak dapat mengandalkan
DISABLE KEYS;
danENABLE KEYS;
untuk InnoDB karena tidak diterapkan di InnoDB Storage Engine. BerjalanALTER TABLE ... DISABLE KEYS;
danALTER TABLE ... ENABLE KEYS;
dirancang untuk MyISAM. Seperti yang tertulis di Dokumentasi MySQL untukALTER TABLE
:Tidak disebutkan tentang InnoDB dalam konteks dengan
ALTER TABLE ... DISABLE/ENABLE KEYS;
Bahkan jika Anda menjalankan
ALTER TABLE ... DISABLE KEYS;
terhadap tabel InnoDB, itu menghasilkan peringatan:Itu sebabnya tidak ada pengaruhnya. Harap ingat bahwa @ jynus menyebutkan hal yang sama dalam jawabannya di bulletpoint 7 .
Perlu diingat juga bahwa MyISAM menyimpan data dan indeks dalam dua file terpisah (.MYD untuk data, .MYI untuk indeks), sehingga sepele untuk menonaktifkan dan mengaktifkan indeks. InnoDB menyimpan KUNCI UTAMA dan data baris di halaman InnoDB yang sama (melalui Indeks Clustered). Indeks sekunder akan membawa KUNCI UTAMA sebagai lampiran untuk setiap entri daun indeks sekunder . Karena data dan indeks terjalin melalui Clustered Index, belum ada yang mencoba untuk mengimplementasikan
DISABLE KEYS
danENABLE KEYS
dalam InnoDB.sumber