mysql提供了分析表检查表和优化表的语句,分析表主要是分析关键字的分部,检查表主要是检查表是否存在错误,优化表则是消除删除或更新造成的空间浪费
1.分析表analyzetable
mysql提供了analyzetable语句分析表,analyzetable语句基本语法如下:
analyze[local
no_write_to_binlog]tabletable_name[,table_name]
local关键字是no_write_to_binlog的别名,二者都是执行过程不写入二进制日志,这里表名可以有多个,注意使用analyzetable分析表的过程中,数据库系统会对表添加只读锁,也就是在分析过程中只能读取表中记录,而不能更新和插入记录,该操作能分析InnoDB,BDB,和MyISAM表。
analyzelocaltableout_crm_user_day;
分析表其实真正要做的是对表的cardinality(散列程度)进行统计更新,因为它决定是否走索引,如果cardinality和实际数据严重不符,会导致索引失效。
showindexfromout_crm_user_day
分析表其实就是让上图中的cardinality比较准确
2.检查表checktable
数据库经常可能遇到错误,比如数据写入磁盘时发生错误,或是索引没有同步更新,或者数据库未关闭mysql就停止了。遇到这些情况,数据库有可能发生错误:
incorrectkeyfilefortable:.trytorepairit
此时我们可以使用checktable来检查表及其对应的索引,checktable语句能够检查InnoDB和MyISAM类型的表,对于MyISAM类型的表,checktable语句还会更新关键字统计信息,而且checktable也可以检查视图的错误,比如在视图中定义的表不存在了
checktabletable_name[,table_name][option]
option={quick
fast
medium
extended
changed}
quick:不扫描行,不检查错误的连接
fast:只检查没有正确关闭的表
changed:只检查上次检查后的被更改的表和没有正确关闭的表
medium:扫描行,以验证被删除的连接是有效的,也可以计算各行的关键字校验和,并使用计算出的校验和验证这一点。
extended:对每行的所有关键字进行一个全面的关键字查找,可以确保表是%一致的,但花费时间较长。
注意:option只对MyISAM类型表有效,对InnoDB表无效,而且checktable在执行过程中也会给表添加只读锁
3.优化表optimizetable
mysql使用optimizetable语句来优化表,该语句对InnoDB和MyISAM类型的表都有效,但是该语句只能优化表中的varchar,blob或text类型的字段
optimize[local
no_write_to_binlog]tabletable_name
local是no_write_to_binlog的同义词,意思是不写入二进制日志,该操作也会读表添加只读锁。
注意:一个表使用了text或者blob类型的数据,如果已经删除了表的一大部分,或者对函可变长度的表进行了更新,则应使用optimizetable指令来从新利用未使用的空间,并整理数据文件碎片,在多少设置中,根本不需要运行该指令,即使对可变长度进行了大量的更新,也不需要经常运行,每周或每月运行一次即可,并且只对需要的表进行优化即可