Mysql içinde optimize tablo ve analiz tablo arasındaki fark nedir


29

Mysql'de optimize tablo ve analiz tablo arasındaki fark nedir? Çevrimiçi dokümanları okudum, ancak aradaki farkın ne olduğundan emin değilim.

Yanıtlar:


28

@ 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;

MyISAM

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ı:

InnoDB ( innodb_file_per_table etkin)

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.ibd

Ne zaman OPTIMIZE TABLE mydb.mytableyürütüldüğünde, mytable.ibdküçüldü alır.

InnoDB ( innodb_file_per_table devre dışı)

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

InnoDB Tesisat

GÜNCELLEME 2013-02-26 22:33 EST

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 :


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?
Boolean

@RolandoMySQLDBA "Koşamazsınız" derken ne demek istediğinizi anlamadı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 .
Michael - sqlbot

@ Michael-sqlbot Cevabımda gösterildiği gibi 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;.
RolandoMySQLDBA

Doğru, ama bunun sizin için hemen gerçekleştiğini iddia ediyorum, çünkü test ettiğiniz masa çok küçüktü. Siz 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.
Michael - sqlbot

15

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.

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.