Rol*_*DBA 32
要扩展@MitchWheat 的回答(直接回答+1):
ANALYZE TABLE检查密钥分布并将它们存储在INFORMATION_SCHEMA.STATISTICS 中。
OPTIMIZE TABLE在进行一些表压缩后执行ANALYZE TABLE。OPTIMIZE TABLE mydb.mytable;如果表是 MyISAM的等价物是这样的:
ALTER TABLE mydb.mytable ENGINE=MyISAM;
ANALYZE TABLE mydb.mytable;
Run Code Online (Sandbox Code Playgroud)
对于 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 不同。这是它的不同之处:
每个表的数据和索引都存储在一个外部表空间文件中。对于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被缩小了。
只会/var/lib/mysql/mydb/mytable.frm存在。表的所有数据和索引页mydb.mytable都存储在系统表空间文件中/var/lib/mysql/ibdata1。
当OPTIMIZE TABLE mydb.mytable被执行时,数据和索引页在ibdata1中连续写入。不幸的是,这使得 ibdata1 突飞猛进。
请参阅Percona 首席技术官 Vadim Tkachenko 的图示
你的评论是
我认为,不支持 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 存储引擎都会根据通过索引中的页面来估计表基数。如果有大量的INSERTs,UPDATEs和DELETEs,那么你将需要ANALYZE TABLE。当有大量 时DELETEs,则ALTER TABLE mydb.mytable ENGINE=InnoDB;需要缩小表。
ANALYZE TABLE在某些情况下,我实际上写了关于 InnoDB无用的帖子:
Oct 16, 2011:突然不得不重建索引以防止网站宕机Jun 21, 2011: MySQL Query Optimizer 从哪里读取索引统计信息?Mit*_*eat 18
取决于您的 MySQL 版本和存储引擎,但一般而言:
OPTIMIZE TABLE 分析表,存储表的密钥分布,回收未使用的空间并对数据文件进行碎片整理。
ANALYZE TABLE 只分析表并存储键分布。
| 归档时间: |
|
| 查看次数: |
81752 次 |
| 最近记录: |