mysql analyze和optimize

Analyze Table

MySQL 的Optimizer(优化元件)在优化SQL语句时,首先须要收集一些相关信息,其中就包括表的cardinality(能够翻译为“散列程度”),它表示某个索引对应的列包含多少个不一样的值——若是cardinality大大少于数据的实际散列程度,那么索引就基本失效了。优化

咱们可使用SHOW INDEX语句来查看索引的散列程度:

SHOW INDEX FROM PLAYERS;

TABLE   KEY_NAME COLUMN_NAME CARDINALITY
------- -------- ----------- -----------
PLAYERS PRIMARY PLAYERNO             14

由于此时PLAYER表中不一样的PLAYERNO数量远远多于14,索引基本失效。
下面咱们经过Analyze Table语句来修复索引:

ANALYZE TABLE PLAYERS;
SHOW INDEX FROM PLAYERS;
结果是:
TABLE   KEY_NAME COLUMN_NAME CARDINALITY
------- -------- ----------- -----------
PLAYERS PRIMARY PLAYERNO           1000

此时索引已经修复,查询效率大大提升。

须要注意的是,若是开启了binlog,那么Analyze Table的结果也会写入binlog,咱们能够在analyze和table之间添加关键字local取消写入 
spa

 

Optimize Table

若是您已经删除了表的一大部分,或者若是您已经对含有可变长度行的表(含有VARCHAR, BLOB或TEXT列的表)进行了不少更改,则应使用 OPTIMIZE TABLE。被删除的记录被保持在连接清单中,后续的INSERT操做会从新使用旧的记录位置。您可使用OPTIMIZE TABLE来从新 利用未使用的空间,并整理数据文件的碎片。翻译

在多数的设置中,您根本不须要运行OPTIMIZE TABLE。即便您对可变长度的行进行了大量的更新,您也不须要常常运行,每周一次或每个月一次 便可,只对特定的表运行。索引

OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起做用。it

注意,在OPTIMIZE TABLE运行过程当中,MySQL会锁定表。table

与Analyze Table同样,Optimize Table也可使用local来取消写入binlog。class

相关文章
相关标签/搜索