Apa yang dimaksud dengan "Tabel tidak mendukung pengoptimalan, malah melakukan pembuatan ulang + analisis"?

100

Saya sedang mengerjakan MySQL 5.5 dan mencoba melakukan pembangunan kembali indeks menggunakan OPTIMIZE TABLEkueri. Saya mendapatkan kesalahan di bawah ini:

Tabel tidak mendukung pengoptimalan, sebagai gantinya lakukan pembuatan ulang + analisis

Apa artinya ini? Apakah mesin MySQL tidak mengizinkan Index Rebuild? Apa yang dilakukan di balik pesan ini, pada level Mesin MySQL 5.5?

Vikrant More
sumber

Jawaban:

193

Itu benar-benar pesan informasional.

Kemungkinan, Anda sedang melakukan OPTIMASI pada tabel InnoDB (tabel menggunakan mesin penyimpanan InnoDB, bukan mesin penyimpanan MyISAM ).

InnoDB tidak mendukung OPTIMASI seperti yang dilakukan MyISAM. Itu melakukan sesuatu yang berbeda. Ini membuat tabel kosong, dan menyalin semua baris dari tabel yang ada ke dalamnya, dan pada dasarnya menghapus tabel lama dan mengganti nama tabel baru, lalu menjalankan ANALISIS untuk mengumpulkan statistik. Itulah yang paling dekat yang bisa dilakukan InnoDB untuk melakukan OPTIMASI.

Pesan yang Anda dapatkan pada dasarnya adalah server MySQL yang mengulangi apa yang dikatakan mesin penyimpanan InnoDB kepada server MySQL:

Tabel tidak mendukung pengoptimalan adalah mesin penyimpanan InnoDB mengatakan ...

"Saya (mesin penyimpanan InnoDB) tidak melakukan operasi OPTIMASI seperti yang dilakukan teman saya (mesin penyimpanan MyISAM)."

"melakukan membuat ulang + menganalisis" adalah mesin penyimpanan InnoDB mengatakan ...

"Saya telah memutuskan untuk melakukan serangkaian operasi berbeda yang akan mencapai hasil yang setara."

spencer7593
sumber
14
ok, bisakah Anda berbagi cara berbeda yang Anda lakukan.
Vikrant More
Saya yakin ini ada di Manual Referensi MySQL di suatu tempat; ini adalah perilaku yang diharapkan, dan tidak ada yang perlu dikhawatirkan. (Kecuali bahwa tabel akan "dikunci" dan tidak tersedia saat proses berjalan sampai selesai, yang dapat memakan waktu beberapa saat untuk tabel HUGH JASS.) Referensi: https://dev.mysql.com/doc/refman/5.5/ en / optimization-table.html Lihat bagian "detail InnoDB".
spencer7593
Anda juga dapat menggunakan MySQL Workbench untuk melakukan pengoptimalan tabel. Lihat dokumentasi Skema dan Pemeriksa Tabel untuk informasi tambahan. Perhatikan opsi "Optimalkan Tabel".
Philip Olson
1
Penjelasan yang sangat bagus untuk orang-orang yang memulai di dunia db. Terima kasih banyak
tachomi
5
Hati-hati - jangan gunakan ini jika ruang disk Anda hampir habis karena kemungkinan akan menyebabkan server Anda kehabisan tenaga saat mencoba membuat ulang tabel yang sangat besar.
Danny Staple
22

OPTIMIZE TABLEberfungsi dengan baik dengan mesin InnoDB menurut artikel dukungan resmi: http://dev.mysql.com/doc/refman/5.5/en/optimize-table.html

Anda akan melihat bahwa mengoptimalkan tabel InnoDB akan membangun kembali struktur tabel dan memperbarui statistik indeks (seperti ALTER TABLE).

Ingatlah bahwa pesan ini dapat berupa sebutan informasional saja dan informasi yang paling penting adalah status kueri Anda: OK!

mysql> OPTIMIZE TABLE foo;
+----------+----------+----------+-------------------------------------------------------------------+
| Table    | Op       | Msg_type | Msg_text                                                          |
+----------+----------+----------+-------------------------------------------------------------------+
| test.foo | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.foo | optimize | status   | OK                                                                |
+----------+----------+----------+-------------------------------------------------------------------+
sdesvergez.dll
sumber
2
Tidak juga, MySQL akan memberikan alasan kegagalan: Kegagalan penulisan file sementara, Operasi Gagal.
iwind
8

Pilihan terbaik adalah membuat tabel baru dengan properti yang sama

CREATE TABLE <NEW.NAME.TABLE> LIKE <TABLE.CRASHED>;
INSERT INTO <NEW.NAME.TABLE> SELECT * FROM <TABLE.CRASHED>;

Ubah nama NEW.NAME.TABLE dan TABLE.CRASH

RENAME TABLE <TABLE.CRASHED> TO <TABLE.CRASHED.BACKUP>;
RENAME TABLE <NEW.NAME.TABLE> TO <TABLE.CRASHED>;

Setelah berfungsi dengan baik, hapus

DROP TABLE <TABLE.CRASHED.BACKUP>;
tquang
sumber
2
Apakah metode ini menyimpan indeks dan pemicu?
Joel Murphy
1
Ya tentu saja. Mereka semua! Anda dapat mencobanya kemudian menggunakan phpMyAdmin untuk memeriksa lagi
tquang
2
Ini tidak membuat ulang Kunci Asing.
DanB
1

Opsi yang lebih baik adalah membuat tabel baru, salin baris ke tabel tujuan, lepaskan tabel aktual dan ganti nama tabel yang baru dibuat. Metode ini bagus untuk tabel kecil,

ASHOK MANGHAT
sumber
3
Saya akan menyarankan untuk mengumpulkan kode contoh agar sesuai dengan jawaban Anda. Lihat bagaimana saya menulis jawaban yang bagus
Frits