Jawaban:
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;
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.mytable
akan mengecilkan .MYD
dan .MYI
file untuk tabel.
Ini tidak sama untuk InnoDB. Inilah perbedaannya:
Data dan indeks setiap tabel disimpan dalam file tablespace eksternal. Untuk datadir
is /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.mytable
dieksekusi, mytable.ibd
akan menyusut.
Hanya /var/lib/mysql/mydb/mytable.frm
akan ada. Semua data dan halaman indeks untuk tabel mydb.mytable
disimpan dalam file tablespace sistem /var/lib/mysql/ibdata1
.
Ketika OPTIMIZE TABLE mydb.mytable
dieksekusi, data dan halaman indeks ditulis secara berdekatan di ibdata1. Sayangnya, ini membuat ibdata1 tumbuh pesat.
Lihat Representasi Bergambar dari Percona CTO Vadim Tkachenko
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 TABLE
sebagai 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 TABLE
melawan 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
, UPDATEs
dan 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 TABLE
pada InnoDB dalam kasus tertentu:
OPTIMIZE TABLE
." Ketika Anda OPTIMIZE TABLE
untuk tabel InnoDB, MySQL melakukan ALTER TABLE ... ENGINE=InnoDB
dan ANALYZE TABLE ...
operasi untuk Anda ketika mengatakan "melakukan buat ulang + menganalisis tabel."
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;
.
OPTIMIZE TABLE
menggunakan InnoDB, server sebenarnya menjalankan ALTER TABLE ... ENGINE=InnoDB
dan di ANALYZE TABLE
belakang layar sebelum mengembalikan respons itu ... sehingga Anda memang dapat menjalankan OPTIMIZE TABLE
InnoDB, dan mencapai efek yang diinginkan.
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.