Яка різниця між оптимізацією таблиці та аналізом таблиці в mysql


29

Яка різниця між оптимізацією таблиці та аналізом таблиці в mysql? Я читав онлайн-документи, але не знаю, у чому різниця.

Відповіді:


28

Щоб розгорнути відповідь на @ MitchWheat (+1 для прямого відповіді першим):

ТАБЛИКА АНАЛІЗУ вивчає розподіл ключів та зберігає їх у INFORMATION_SCHEMA.STATISTICS .

ОПТИМІЗУВАННЯ ТАБЛИЦІ виконує АНАЛІЗУВАННУ ТАБЛИЦІ після деякого стиснення таблиці. Еквівалент,OPTIMIZE TABLE mydb.mytable;якщо таблиця була MyISAM, така:

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

MyISAM

Для таблиці 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. Ось як це інакше:

InnoDB ( включений innodb_file_per_table )

Дані та покажчики кожної таблиці зберігаються у файлі зовнішнього простору таблиць. Для datadirє /var/lib/mysql та таблиця mydb.mytableвона зберігатиметься так:

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

Коли OPTIMIZE TABLE mydb.mytableвиконується, mytable.ibdвін скорочується.

InnoDB ( innodb_file_per_table вимкнено)

Тільки /var/lib/mysql/mydb/mytable.frmіснували б. Всі сторінки даних та покажчики таблиці mydb.mytableзберігаються у файлі системного простору таблиць /var/lib/mysql/ibdata1.

Коли OPTIMIZE TABLE mydb.mytableце виконується, сторінки даних та покажчики записуються безперервно в ibdata1. На жаль, це змушує ibdata1 рости в невдовзі.

Дивіться живописне представництво від СОТ Percona Вадима Ткаченка

InnoDB сантехніка

ОНОВЛЕННЯ 2013-02-26 22:33 EST

Ваш коментар був

Я думаю, таблиця оптимізації для 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 в певних випадках:


Я думаю, таблиця оптимізації для innodb не підтримується. Я отримав повідомлення, індекс буде відтворено. Як це працює?
Булевий

@RolandoMySQLDBA Я не впевнений, що означає, коли ти кажеш: "ти не можеш бігати OPTIMIZE TABLE". Коли ви OPTIMIZE TABLEвикористовуєте таблицю InnoDB, MySQL виконує ALTER TABLE ... ENGINE=InnoDBта виконує ANALYZE TABLE ...операції для вас, коли пише "замість цього робимо відтворити + проаналізувати таблицю".
Майкл - sqlbot

@ Michael-sqlbot Як показано в моїй обороні, я побіг OPTIMIZE TABLE dat;в MySQL 5.5.29 і скаржився відразу Table does not support optimize, doing recreate + analyze instead. Ось чому я рекомендую ALTER TABLE dat ENGINE=InnoDB; ANALYZE TABLE dat;.
RolandoMySQLDBA

Правильно, але я б запевнив, що це сталося негайно для вас, оскільки таблиця, на яку ви протестували, була дуже маленькою. Коли ви перебуваєте OPTIMIZE TABLEв InnoDB, сервер насправді виконує ALTER TABLE ... ENGINE=InnoDBі ANALYZE TABLEза кадром, перш ніж повертати цю відповідь ... так що ви дійсно можете працювати OPTIMIZE TABLEна InnoDB і домогтися наміченого ефекту.
Майкл - sqlbot

15

Залежить від вашої версії MySQL та механізму зберігання даних, але загалом:

ОПТИМІЗАЦІЯ ТАБЛИЦІ Аналізує таблицю, зберігає розподіл ключів для таблиці, повертає невикористаний простір і дефрагментує файл даних.

ТАБЛИКА АНАЛІЗУ Тільки аналізує таблицю та зберігає розподіл ключів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.