Apa perbedaan antara mengoptimalkan tabel dan menganalisis tabel di mysql

29

Apa perbedaan antara tabel mengoptimalkan dan menganalisis tabel di mysql? Saya telah membaca dokumen online, tetapi tidak yakin apa bedanya.

Boolean
sumber

Jawaban:

28

Untuk memperluas jawaban @ MitchWheat (+1 untuk langsung menjawab pertama):

TABEL ANALYZ memeriksa distribusi utama dan menyimpannya di INFORMATION_SCHEMA.STATISTICS .

OPTIMASI TABEL melakukan TABEL ANALISIS setelah melakukan beberapa kompresi tabel. Setara denganOPTIMIZE TABLE mydb.mytable;jika tabel itu MyISAM adalah ini:

ALTER TABLE mydb.mytable ENGINE=MyISAM;
ANALYZE TABLE mydb.mytable;

MyISAM

Untuk tabel MyISAM mydb.mytable di datadir /var/lib/mysql, Anda memiliki file berikut:

  • /var/lib/mysql/mydb/mytable.frm
  • /var/lib/mysql/mydb/mytable.MYD (data)
  • /var/lib/mysql/mydb/mytable.MYI (indeks)

OPTIMIZE TABLE mydb.mytableakan mengecilkan .MYDdan .MYIfile untuk tabel.

Ini tidak sama untuk InnoDB. Inilah perbedaannya:

InnoDB ( innodb_file_per_table diaktifkan)

Data dan indeks setiap tabel disimpan dalam file tablespace eksternal. Untuk datadiris /var/lib/mysql dan tabel mydb.mytable, itu akan disimpan sebagai berikut:

  • /var/lib/mysql/mydb/mytable.frm
  • /var/lib/mysql/mydb/mytable.ibd

Ketika OPTIMIZE TABLE mydb.mytabledieksekusi, mytable.ibdakan menyusut.

InnoDB ( innodb_file_per_table dinonaktifkan)

Hanya /var/lib/mysql/mydb/mytable.frmakan ada. Semua data dan halaman indeks untuk tabel mydb.mytabledisimpan dalam file tablespace sistem /var/lib/mysql/ibdata1.

Ketika OPTIMIZE TABLE mydb.mytabledieksekusi, data dan halaman indeks ditulis secara berdekatan di ibdata1. Sayangnya, ini membuat ibdata1 tumbuh pesat.

Lihat Representasi Bergambar dari Percona CTO Vadim Tkachenko

Pipa InnoDB

UPDATE 2013-02-26 22:33 EST

Anda berkomentar

Saya pikir, optimalkan tabel untuk innodb tidak didukung. Saya mendapat pesan, indeks akan dibuat ulang. Bagaimana cara kerjanya?

Saya mencoba ini

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>

Anda benar. Anda tidak dapat berjalan OPTIMIZE TABLEsebagai satu operasi. Apa yang dilakukan InnoDB adalah sebagai berikut:

ALTER TABLE mydb.mytable ENGINE=InnoDB;
ANALYZE TABLE mydb.mytable;

Anda juga bisa menjalankan langkah-langkah ini sendiri.

Namun, dalam semua kejujuran, Anda tidak harus berlari ANALYZE TABLEmelawan tabel InnoDB karena setiap kali kueri dieksekusi, InnoDB Storage Engine melakukan estimasi pada kardinalitas tabel berdasarkan melewati halaman dalam indeks. Jika ada sejumlah tinggi INSERTs, UPDATEsdan DELETEs, maka Anda akan perlu ANALYZE TABLE. Ketika ada jumlah yang tinggi DELETEs, maka ALTER TABLE mydb.mytable ENGINE=InnoDB;diperlukan untuk mengecilkan tabel.

Saya benar-benar menulis posting tentang kesia-siaan ANALYZE TABLEpada InnoDB dalam kasus tertentu:

RolandoMySQLDBA
sumber
Saya pikir, optimalkan tabel untuk innodb tidak didukung. Saya mendapat pesan, indeks akan dibuat ulang. Bagaimana cara kerjanya?
Boolean
@RolandoMySQLDBA Saya tidak yakin apa artinya ketika Anda berkata, "Anda tidak bisa lari OPTIMIZE TABLE." Ketika Anda OPTIMIZE TABLEuntuk tabel InnoDB, MySQL melakukan ALTER TABLE ... ENGINE=InnoDBdan ANALYZE TABLE ...operasi untuk Anda ketika mengatakan "melakukan buat ulang + menganalisis tabel."
Michael - sqlbot
@ Michael-sqlbot Seperti yang ditunjukkan dalam jawaban saya, saya berlari OPTIMIZE TABLE dat;di MySQL 5.5.29 dan langsung mengeluh Table does not support optimize, doing recreate + analyze instead,. Itu sebabnya saya sarankan ALTER TABLE dat ENGINE=InnoDB; ANALYZE TABLE dat;.
RolandoMySQLDBA
Benar, tetapi saya akan menegaskan bahwa itu terjadi segera untuk Anda karena meja yang Anda uji sangat kecil. Saat Anda OPTIMIZE TABLEmenggunakan InnoDB, server sebenarnya menjalankan ALTER TABLE ... ENGINE=InnoDBdan di ANALYZE TABLEbelakang layar sebelum mengembalikan respons itu ... sehingga Anda memang dapat menjalankan OPTIMIZE TABLEInnoDB, dan mencapai efek yang diinginkan.
Michael - sqlbot
15

Tergantung pada versi MySQL dan mesin penyimpanan Anda tetapi secara umum:

MENGOPTIMALKAN TABEL Menganalisis tabel, menyimpan distribusi kunci untuk sebuah tabel, mengambil kembali ruang yang tidak digunakan dan mendefrag file data.

TABEL ANALISIS Hanya menganalisis tabel dan menyimpan distribusi utama.

Mitch Wheat
sumber