Відповіді:
Щоб розгорнути відповідь на @ MitchWheat (+1 для прямого відповіді першим):
ТАБЛИКА АНАЛІЗУ вивчає розподіл ключів та зберігає їх у INFORMATION_SCHEMA.STATISTICS .
ОПТИМІЗУВАННЯ ТАБЛИЦІ виконує АНАЛІЗУВАННУ ТАБЛИЦІ після деякого стиснення таблиці. Еквівалент,OPTIMIZE TABLE mydb.mytable;якщо таблиця була MyISAM, така:
ALTER TABLE mydb.mytable ENGINE=MyISAM;
ANALYZE TABLE mydb.mytable;
Для таблиці MyISAM mydb.mytable у datadir у /var/lib/mysqlвас є такі файли:
/var/lib/mysql/mydb/mytable.frm/var/lib/mysql/mydb/mytable.MYD (дані)/var/lib/mysql/mydb/mytable.MYI (індекси)OPTIMIZE TABLE mydb.mytableзменшиться .MYDі .MYIфайли для таблиці.
Це не те саме для InnoDB. Ось як це інакше:
Дані та покажчики кожної таблиці зберігаються у файлі зовнішнього простору таблиць. Для datadirє /var/lib/mysql та таблиця mydb.mytableвона зберігатиметься так:
/var/lib/mysql/mydb/mytable.frm/var/lib/mysql/mydb/mytable.ibdКоли OPTIMIZE TABLE mydb.mytableвиконується, mytable.ibdвін скорочується.
Тільки /var/lib/mysql/mydb/mytable.frmіснували б. Всі сторінки даних та покажчики таблиці mydb.mytableзберігаються у файлі системного простору таблиць /var/lib/mysql/ibdata1.
Коли OPTIMIZE TABLE mydb.mytableце виконується, сторінки даних та покажчики записуються безперервно в ibdata1. На жаль, це змушує ibdata1 рости в невдовзі.
Дивіться живописне представництво від СОТ Percona Вадима Ткаченка
Ваш коментар був
Я думаю, таблиця оптимізації для innodb не підтримується. Я отримав повідомлення, індекс буде відтворено. Як це працює?
Я спробував це
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>
Ви праві. Ви не можете виконати OPTIMIZE TABLEодну операцію. Натомість InnoDB робить наступне:
ALTER TABLE mydb.mytable ENGINE=InnoDB;
ANALYZE TABLE mydb.mytable;
Ви також можете просто виконати ці кроки самостійно.
Однак, чесно кажучи, вам не доведеться бігати ANALYZE TABLEз таблицею InnoDB, оскільки кожен раз, коли виконується запит, InnoDB Storage Engine виконує оцінку кардинальності таблиці на основі проходження сторінок в індексах. Якщо є велика кількість INSERTs, UPDATEsі DELETEs, то вам потрібно буде ANALYZE TABLE. Коли є велика кількість DELETEs, тоді ALTER TABLE mydb.mytable ENGINE=InnoDB;потрібно скоротити стіл.
Я фактично писав повідомлення про марність ANALYZE TABLEInnoDB в певних випадках:
OPTIMIZE TABLE". Коли ви OPTIMIZE TABLEвикористовуєте таблицю InnoDB, MySQL виконує ALTER TABLE ... ENGINE=InnoDBта виконує ANALYZE TABLE ...операції для вас, коли пише "замість цього робимо відтворити + проаналізувати таблицю".
OPTIMIZE TABLE dat;в MySQL 5.5.29 і скаржився відразу Table does not support optimize, doing recreate + analyze instead. Ось чому я рекомендую ALTER TABLE dat ENGINE=InnoDB; ANALYZE TABLE dat;.
OPTIMIZE TABLEв InnoDB, сервер насправді виконує ALTER TABLE ... ENGINE=InnoDBі ANALYZE TABLEза кадром, перш ніж повертати цю відповідь ... так що ви дійсно можете працювати OPTIMIZE TABLEна InnoDB і домогтися наміченого ефекту.
Залежить від вашої версії MySQL та механізму зберігання даних, але загалом:
ОПТИМІЗАЦІЯ ТАБЛИЦІ Аналізує таблицю, зберігає розподіл ключів для таблиці, повертає невикористаний простір і дефрагментує файл даних.
ТАБЛИКА АНАЛІЗУ Тільки аналізує таблицю та зберігає розподіл ключів.