Yanıtlar:
@ MitchWheat'in yanıtını genişletmek için (önce doğrudan yanıtlamak için +1):
ANALYZE TABLE, anahtar dağılımı inceler ve bunları INFORMATION_SCHEMA.STATISTICS öğesinde saklar.
OPTİMİZE TABLO gerçekleştirdiği TABLO ANALİZİ bazı tablo sıkıştırma yaptıktan sonra. OPTIMIZE TABLE mydb.mytable;Tablonun MyISAMolupolmadığınınkarşılığışudur:
ALTER TABLE mydb.mytable ENGINE=MyISAM;
ANALYZE TABLE mydb.mytable;
Datadir'deki mydb.mytable MyISAM tablosu /var/lib/mysqliçin aşağıdaki dosyalara sahipsiniz:
/var/lib/mysql/mydb/mytable.frm/var/lib/mysql/mydb/mytable.MYD (veri)/var/lib/mysql/mydb/mytable.MYI (Gösterge)OPTIMIZE TABLE mydb.mytableküçültmek olur .MYDve .MYItablo için dosyaları.
Bu InnoDB için aynı değildir. İşte farklı:
Her tablonun verileri ve indeksleri harici bir tablo alanı dosyasında saklanır. İçin datadirIS /var/lib/mysql ve masa mydb.mytableaşağıdaki şekilde saklanabilir olacaktır:
/var/lib/mysql/mydb/mytable.frm/var/lib/mysql/mydb/mytable.ibdNe zaman OPTIMIZE TABLE mydb.mytableyürütüldüğünde, mytable.ibdküçüldü alır.
Sadece /var/lib/mysql/mydb/mytable.frmvar olur. Tablonun tüm veri ve indeks sayfaları mydb.mytablesistem tablo alanı dosyasında saklanır /var/lib/mysql/ibdata1.
Ne zaman OPTIMIZE TABLE mydb.mytableyürütülür, veri ve dizin sayfaları ibdata1 içinde bitişik yazılır. Ne yazık ki, bu, ibdata1'in sıçrama ve sınırlarda büyümesini sağlar.
Bkz Percona CTO Vadim Tkachenko gelen Resimli Temsil
Yorum yaptın
Sanırım, Innodb için en iyi duruma getirme tablo desteklenmiyor. Bir mesajım var, indeks yeniden oluşturulacak. O nasıl çalışır?
Bunu denedim
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.29 MySQL Community Server (GPL)
Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use test
Database changed
mysql> create table dat (a int, primary key (a));
Query OK, 0 rows affected (0.08 sec)
mysql> insert into dat values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
Query OK, 10 rows affected (0.04 sec)
Records: 10 Duplicates: 0 Warnings: 0
mysql> analyze table dat;
+----------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+----------+---------+----------+----------+
| test.dat | analyze | status | OK |
+----------+---------+----------+----------+
1 row in set (0.06 sec)
mysql> optimize table dat;
+----------+----------+----------+-------------------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+----------+----------+----------+-------------------------------------------------------------------+
| test.dat | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| test.dat | optimize | status | OK |
+----------+----------+----------+-------------------------------------------------------------------+
2 rows in set (0.14 sec)
mysql>
Haklısın. Sen koşamam OPTIMIZE TABLEtek bir işlem olarak. Bunun yerine InnoDB ne yapar:
ALTER TABLE mydb.mytable ENGINE=InnoDB;
ANALYZE TABLE mydb.mytable;
Ayrıca bu adımları kendiniz de uygulayabilirsiniz.
Ancak, dürüst olmak gerekirse, ANALYZE TABLEbir sorgu yürütüldüğü için InnoDB masasına karşı koşmak zorunda kalmamanız gerekir, çünkü InnoDB Depolama Motoru, endekslerdeki sayfalardan geçmeye dayanarak tablo kardinalitesi hakkında bir tahmin yapar. Yüksek sayıda varsa INSERTs, UPDATEsve DELETEs, o zaman gerekecektir ANALYZE TABLE. Çok sayıda olduğunda DELETEs, ALTER TABLE mydb.mytable ENGINE=InnoDB;masayı küçültmek için gereklidir.
Aslında ANALYZE TABLE, bazı durumlarda InnoDB’nin geleceği hakkında yazılar yazdım :
OPTIMIZE TABLE. Bir OPTIMIZE TABLEInnoDB masası için MySQL, "yeniden yapma ve tabloyu analiz etme" derken sizin için ALTER TABLE ... ENGINE=InnoDBve ANALYZE TABLE ...işlemleri gerçekleştiriyor .
OPTIMIZE TABLE dat;, MySQL 5.5.29 'da koştum ve hemen şikayet etti Table does not support optimize, doing recreate + analyze instead. Bu yüzden tavsiye ederim ALTER TABLE dat ENGINE=InnoDB; ANALYZE TABLE dat;.
OPTIMIZE TABLEInnoDB'deyken, sunucu aslında bu yanıtı geri vermeden önce sahnelerin gerisinde çalışır ALTER TABLE ... ENGINE=InnoDBve ANALYZE TABLEgerisinde çalışır ... böylece OPTIMIZE TABLEInnoDB üzerinde çalışabilir ve istenen efekti elde edebilirsiniz.
MySQL sürümünüze ve depolama motorunuza bağlı, ancak genel olarak:
OPTİMİZE TABLO Tabloyu analiz eder, tablo dağıtım anahtarını saklar, kullanılmayan alanı geri kazanır ve veri dosyasını birleştirir.
ANALİZ TABLOSU Yalnızca tabloyu analiz eder ve ana dağılımı saklar.