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


29

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

Answers:


28

要扩展@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;

我的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 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存储引擎都会根据索引中的页面传递对表基数进行估算。如果有大量的INSERTsUPDATEsDELETEs,那么你将需要ANALYZE TABLE。当数量过多时DELETEs,则ALTER TABLE mydb.mytable ENGINE=InnoDB;需要缩小表。

我实际上ANALYZE TABLE在某些情况下写了关于InnoDB 的无效性的文章:


我认为,不支持针对innodb的优化表。我收到一条消息,索引将被重新创建。它是如何工作的?
布尔布尔

@RolandoMySQLDBA我不确定当您说“您不能跑步OPTIMIZE TABLE” 时是什么意思。当您OPTIMIZE TABLE使用InnoDB表时,MySQL会显示“执行重新创建+分析表”来为您执行ALTER TABLE ... ENGINE=InnoDBANALYZE TABLE ...操作。
Michael-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=InnoDBANALYZE TABLE幕后执行,因此您确实可以OPTIMIZE TABLE在InnoDB上运行并达到预期的效果。
Michael-sqlbot

15

取决于您的MySQL和存储引擎版本,但通常来说:

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

ANALYZE TABLE 仅分析表并存储密钥分布。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.