it-swarm-eu.dev

Jaký je rozdíl mezi optimalizací tabulky a analýzou tabulky v mysql

Jaký je rozdíl mezi optimalizací tabulky a analýzou tabulky v mysql? Přečetl jsem online dokumenty, ale nejsem si jistý, jaký je rozdíl.

31
Boolean

Rozbalit na @ MitchWheatova odpověď (+1 pro přímou odpověď jako první):

ANALYZE TABULKA zkoumá distribuci klíčů a ukládá je do INFORMAČNÍCH_STŘEDÍCH .

OPTIMALIZOVAT TABULKU provede ANALYZE TABULKU po provedení nějaké komprese tabulky. Ekvivalent OPTIMIZE TABLE mydb.mytable; pokud tabulka byla MyISAM je tato:

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

MyISAM

Pro tabulku MyISAM mydb.mytable v datadir /var/lib/mysql, máte následující soubory:

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

OPTIMIZE TABLE mydb.mytable by zmenšilo .MYD a .MYI soubory tabulky.

To není stejné pro InnoDB. Zde je, jak se liší:

InnoDB ( innodb_file_per_table povoleno)

Data a indexy každé tabulky jsou uloženy v externím souboru tabulkového prostoru. Pro datadir je /var/lib/mysql a tabulka mydb.mytable, bude uloženo takto:

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

Když OPTIMIZE TABLE mydb.mytable je provedeno, mytable.ibd se zmenšuje.

InnoDB ( innodb_file_per_table zakázáno)

Pouze /var/lib/mysql/mydb/mytable.frm by existovalo. Všechna data a indexové stránky tabulky mydb.mytable jsou uloženy v souboru systémových tabulek /var/lib/mysql/ibdata1.

Když OPTIMIZE TABLE mydb.mytable se spustí, data a indexové stránky se zapíší souvisle do ibdata1. Bohužel to způsobí, že ibdata1 roste mílovými kroky.

Viz Obrazová reprezentace z CTO Percona Vadima Tkachenka

InnoDB Plumbing

AKTUALIZACE 2013-02-26 22:33 EST

Váš komentář byl

Myslím, že optimalizace tabulky pro innodb není podporována. Dostal jsem zprávu, index bude znovu vytvořen. Jak to funguje?

Zkusil jsem to

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>

Máte pravdu. Nelze spustit OPTIMIZE TABLE jako jediná operace. InnoDB místo toho dělá následující:

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

Tyto kroky můžete také spustit sami.

Ve vší upřímnosti byste však neměli spouštět ANALYZE TABLE proti tabulce InnoDB, protože při každém provedení dotazu provádí InnoDB Storage Engine odhad kardinality tabulky na základě procházení stránek v indexech. Pokud existuje vysoký počet INSERTs, UPDATEs a DELETEs, pak budete muset ANALYZE TABLE. Pokud je vysoký počet DELETEs, pak ALTER TABLE mydb.mytable ENGINE=InnoDB; je potřeba ke zmenšení stolu.

Vlastně jsem psal příspěvky o marnosti ANALYZE TABLE na InnoDB v určitých případech:

29
RolandoMySQLDBA

Závisí na vaší verzi MySQL a storage engine, ale obecně:

OPTIMIZE TABLE Analyzuje tabulku, ukládá distribuci klíčů pro tabulku, regeneruje nevyužité místo a defragmentuje datový soubor.

ANALYZE TABLE Analyzuje pouze tabulku a ukládá distribuci klíčů.

15
Mitch Wheat