其他分享
首页 > 其他分享> > 60. analyze table和optimize table

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