Відповіді:
Щоб розгорнути відповідь на @ 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 TABLE
InnoDB в певних випадках:
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 та механізму зберігання даних, але загалом:
ОПТИМІЗАЦІЯ ТАБЛИЦІ Аналізує таблицю, зберігає розподіл ключів для таблиці, повертає невикористаний простір і дефрагментує файл даних.
ТАБЛИКА АНАЛІЗУ Тільки аналізує таблицю та зберігає розподіл ключів.