mysqlanalyze和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
查看mysql索引
此时索引已经修复,查询效率⼤⼤提⾼。
需要注意的是,如果开启了binlog,那么Analyze Table的结果也会写⼊binlog,我们可以在analyze和table之间添加关键字local取消写⼊
Optimize Table
如果您已经删除了表的⼀⼤部分,或者如果您已经对含有可变长度⾏的表(含有VARCHAR, BLOB或TEXT列的表)进⾏了很多更改,则应使⽤ OPTIMIZE TABLE。被删除的记录被保持在链接清单中,后
续的INSERT操作会重新使⽤旧的记录位置。您可以使⽤OPTIMIZE TABLE来重新利⽤未使⽤的空间,并整理数据⽂件的碎⽚。
在多数的设置中,您根本不需要运⾏OPTIMIZE TABLE。即使您对可变长度的⾏进⾏了⼤量的更新,您也不需要经常运⾏,每周⼀次或每⽉⼀次即可,只对特定的表运⾏。
OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作⽤。
注意,在OPTIMIZE TABLE运⾏过程中,MySQL会锁定表。
与Analyze Table⼀样,Optimize Table也可以使⽤local来取消写⼊binlog。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。