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/mysql
iç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.mytable
küçültmek olur .MYD
ve .MYI
tablo 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 datadir
IS /var/lib/mysql
ve masa mydb.mytable
aşağıdaki şekilde saklanabilir olacaktır:
/var/lib/mysql/mydb/mytable.frm
/var/lib/mysql/mydb/mytable.ibd
Ne zaman OPTIMIZE TABLE mydb.mytable
yürütüldüğünde, mytable.ibd
küçüldü alır.
Sadece /var/lib/mysql/mydb/mytable.frm
var olur. Tablonun tüm veri ve indeks sayfaları mydb.mytable
sistem tablo alanı dosyasında saklanır /var/lib/mysql/ibdata1
.
Ne zaman OPTIMIZE TABLE mydb.mytable
yü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 TABLE
tek 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 TABLE
bir 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
, UPDATEs
ve 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 TABLE
InnoDB masası için MySQL, "yeniden yapma ve tabloyu analiz etme" derken sizin için ALTER TABLE ... ENGINE=InnoDB
ve 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 TABLE
InnoDB'deyken, sunucu aslında bu yanıtı geri vermeden önce sahnelerin gerisinde çalışır ALTER TABLE ... ENGINE=InnoDB
ve ANALYZE TABLE
gerisinde çalışır ... böylece OPTIMIZE TABLE
InnoDB ü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.