mysql中优化表和分析表有什么区别

Boo*_*ean 35 mysql mysql-5.5

mysql中的优化表和分析表有什么区别?我已经阅读了在线文档,但不确定有什么区别。

Rol*_*DBA 32

要扩展@MitchWheat 的回答(直接回答+1):

ANALYZE TABLE检查密钥分布并将它们存储在INFORMATION_SCHEMA.STATISTICS 中

OPTIMIZE TABLE在进行一些表压缩后执行ANALYZE TABLEOPTIMIZE TABLE mydb.mytable;如果表是 MyISAM的等价物是这样的:

ALTER TABLE mydb.mytable ENGINE=MyISAM;
ANALYZE TABLE mydb.mytable;
Run Code Online (Sandbox Code Playgroud)

我的ISAM

对于 datadir 中的 MyISAM 表 mydb.mytable /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

每个表的数据和索引都存储在一个外部表空间文件中。对于datadiris/var/lib/mysql 和 table 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 首席技术官 Vadim Tkachenko 的图示

InnoDB 管道

更新 2013-02-26 22:33 美国东部时间

你的评论是

我认为,不支持 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>
Run Code Online (Sandbox Code Playgroud)

你是对的。您不能OPTIMIZE TABLE作为单个操作运行。InnoDB 的作用如下:

ALTER TABLE mydb.mytable ENGINE=InnoDB;
ANALYZE TABLE mydb.mytable;
Run Code Online (Sandbox Code Playgroud)

您也可以自己运行这些步骤。

但是,老实说,您不必ANALYZE TABLE针对 InnoDB 表运行,因为每次执行查询时,InnoDB 存储引擎都会根据通过索引中的页面来估计表基数。如果有大量的INSERTsUPDATEsDELETEs,那么你将需要ANALYZE TABLE。当有大量 时DELETEs,则ALTER TABLE mydb.mytable ENGINE=InnoDB;需要缩小表。

ANALYZE TABLE在某些情况下,我实际上写了关于 InnoDB无用的帖子:


Mit*_*eat 18

取决于您的 MySQL 版本和存储引擎,但一般而言:

OPTIMIZE TABLE 分析表,存储表的密钥分布,回收未使用的空间并对数据文件进行碎片整理。

ANALYZE TABLE 只分析表并存储键分布。