60. analyze table和optimize table
作者:互联网
1.Analyze table
ANALYZE [NO_WRITE_TO_BINLOG | LOCAL] TABLE tbl_name [, tbl_name] ... ANALYZE [NO_WRITE_TO_BINLOG | LOCAL] TABLE tbl_name UPDATE HISTOGRAM ON col_name [, col_name] ... [WITH N BUCKETS] ANALYZE [NO_WRITE_TO_BINLOG | LOCAL] TABLE tbl_name DROP HISTOGRAM ON col_name [, col_name] ...
1.analyze table 通常生成表的统计信息
2.analyze table 支持innodb、NOB和myiasm表,但是它不支持视图。
3.如果参数innodb_read_only被启用了,analyze table可能会失败,因为它不能更新在数据目录中表的统计信息
4.对于使用了innodb的表,analyze table操作将会更新key distribution(秘钥分配),failure may occur even if the operation updates the table itself (for example, if it is a MyISAM
table). To obtain the updated distribution statistics, set information_schema_stats_expiry=0
5.analyze table 支持分区表
6.在analyze table 期间,表会被加上一个read lock
7.analyze table 会移除在缓存中的表的定义,而且它要求一个flush lock,因此,如果有长事务在执行的过程中,这个操作将会被阻塞,另外说明一下,analyze table 本身是quicklyd
8.默认情况下,服务器将analyze table操作会记录到binary log中以便去给副本去复制
9.对于innodb表,analyze table 将会更新索引树并相应的更新索引基数,注意这个索引基数只是一个估算值
10.可以通过启用innodb_stats_persisent使得analyze table收集的统计信息更精确和稳定。这个参数主要是对索引列数据进行重大更改后运行analyze table(自动,但是有性能损耗)
11.mysql中在join优化中,如果join不是走正确的索引,可以尝试运行analyze table,也可以在查询中使用force index强制使用特定索引。或者设置max_seeks_for_key系统变量以确保mysql更喜欢索引查找而不是表扫描。
12.analyze table 将会清除information_schema.innodb_sys_tablestats表中的信息,并将status_initialized列设置为未初始化,下次访问该表时会再次收集统计信息。
2.Optimize table
OPTIMIZE [NO_WRITE_TO_BINLOG | LOCAL] TABLE tbl_name [, tbl_name] ...
(1)optimize table 重新组织表中的数据和关联索引数据的物理存储,目的在于减少存储空间和提高访问表时的i/o效率(有磁盘碎片整理功能)
(2)对于独立的表空间(innodb_file_per_table)的表,当有大量的插入、更新、删除操作时,使用optimize table将会重新组织表和索引,并且回收磁盘空间供操作系统使用。
(3)对于innodb表,optimize table 映射到alter table...force,它会重建表以更新索引统计信息并释放聚集索引中未使用的空间
3.innodb detailes
mysql> OPTIMIZE TABLE foo; +----------+----------+----------+-------------------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +----------+----------+----------+-------------------------------------------------------------------+ | test.foo | optimize | note | Table does not support optimize, doing recreate + analyze instead | | test.foo | optimize | status | OK | +----------+----------+----------+-------------------------------------------------------------------+
optimize table对常规和分区innodb表使用在线DDL,这减少了并发DML操作的停机时间,optimize table触发的表的重建就地完成
标签:name,60,索引,innodb,table,analyze,optimize 来源: https://www.cnblogs.com/zmc60/p/16456010.html