"Tablo optimize etmeyi desteklemiyor, bunun yerine yeniden oluştur ve analiz et" ne anlama geliyor?


102

MySQL 5.5 üzerinde çalışıyorum ve bir OPTIMIZE TABLEsorgu kullanarak yeniden dizin oluşturmaya çalışıyorum . Aşağıdaki hatayı alıyorum:

Tablo optimize etmeyi desteklemiyor, bunun yerine yeniden oluştur + analiz yap

Ne anlama geliyor? MySQL motoru Index Rebuild'e izin vermiyor mu? MySQL 5.5 Motor seviyesinde bu mesajın arkasında neler yapılıyor?

Yanıtlar:


195

Bu gerçekten bir bilgi mesajı.

Muhtemelen, bir InnoDB masasında OPTIMIZE yapıyorsunuz ( MyISAM depolama motoru yerine InnoDB depolama motorunu kullanan tablo ).

InnoDB, MyISAM'ın yaptığı gibi OPTIMIZE'ı desteklemez. Farklı bir şey yapar. Boş bir tablo oluşturur ve mevcut tablodaki tüm satırları ona kopyalar ve esasen eski tabloyu siler ve yeni tabloyu yeniden adlandırır ve ardından istatistikleri toplamak için bir ANALYZE çalıştırır. InnoDB'nin OPTIMIZE yapmaya en yakın olanı budur.

Aldığınız mesaj, temelde InnoDB depolama motorunun MySQL sunucusuna söylediği şeyi tekrarlayan MySQL sunucusudur:

InnoDB depolama motoru, tablo optimizasyonu desteklemiyor diyor ki ...

"Ben (InnoDB depolama motoru), arkadaşımın (MyISAM depolama motoru) yaptığı gibi OPTIMIZE işlemi yapmıyorum."

InnoDB depolama motoru "bunun yerine yeniden oluşturma + analiz etme" diyor ...

" Eşdeğer bir sonuç elde edecek farklı bir dizi işlem yapmaya karar verdim ."


14
tamam, yaptığın farklı şekilde paylaşabilir misin lütfen?
Vikrant More

Eminim bu MySQL Referans Kılavuzunda bir yerlerde; bu beklenen bir davranıştır ve endişelenecek bir şey yoktur. (Tablonun "kilitli" olması ve işlem tamamlanana kadar kullanılamaz olması dışında, HUGH JASS tablosu için biraz zaman alabilir.) Referans: https://dev.mysql.com/doc/refman/5.5/ tr / optimize-table.html "InnoDB ayrıntıları" bölümüne bakın.
spencer7593

Tablo optimizasyonunu gerçekleştirmek için MySQL Workbench'i de kullanabilirsiniz. Bkz Şema ve Tablo Müfettiş belgeleri ek bilgi için. "Tabloyu Optimize Et" seçeneğine dikkat edin.
Philip Olson

1
DB dünyasında başlayan insanlar için mükemmel bir açıklama. Çok teşekkür ederim
takomi

5
Dikkat - disk alanınız azsa bunu kullanmayın, çünkü çok büyük tabloyu yeniden oluşturmaya çalışırken sunucunuzun tükenmesine neden olabilir.
Danny Staple

23

OPTIMIZE TABLEResmi destek makalesine göre InnoDB motoru ile iyi çalışıyor: http://dev.mysql.com/doc/refman/5.5/en/optimize-table.html

InnoDB tablolarını optimize etmenin tablo yapısını yeniden oluşturacağını ve dizin istatistiklerini (benzeri bir şey ALTER TABLE) güncelleyeceğini fark edeceksiniz .

Bu mesajın yalnızca bilgilendirme amaçlı olabileceğini ve çok önemli bilgilerin sorgunuzun durumu olduğunu unutmayın: Tamam!

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                                                                |
+----------+----------+----------+-------------------------------------------------------------------+

2
Gerçekte değil, MySQL başarısızlık nedenini verecektir: Geçici dosya yazma hatası, İşlem Başarısız.
2019

9

En iyi seçenek aynı özelliklere sahip yeni tablo oluşturmaktır

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

NEW.NAME.TABLE ve TABLE.CRASH'ı yeniden adlandırın

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

İyi çalıştıktan sonra silin

DROP TABLE <TABLE.CRASHED.BACKUP>;

2
Bu yöntem indeksleri ve tetikleyicileri tutar mı?
Joel Murphy

1
Evet tabi ki. Hepsi! Deneyebilir ve sonra tekrar kontrol etmek için phpMyAdmin'i kullanabilirsiniz
tquang

3
Bu, Yabancı Anahtarı yeniden oluşturmaz.
DanB

1

Daha iyi seçenek, yeni bir tablo oluşturmak, satırları hedef tabloya kopyalamak, asıl tabloyu bırakmak ve yeni oluşturulan tabloyu yeniden adlandırmaktır. Bu yöntem küçük masalar için iyidir,


3
Cevabınızla birlikte örnek kodu bir araya getirmenizi öneririm. Göz at İyi bir cevap yazıyorsunuz nasıl
Frits
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.