MySQL的mysqlcheck命令和Analyze Table分析表

0    2689    1

Tags:

👉 本文共约3438个字,系统预计阅读时间或需13分钟。

information_schema.FILES的total_extents为0

今天查询MySQL占用的磁盘文件大小的时候,返回了0,如下:

于是乎做了一次分析操作:

再次查询:

有值了,于是相对所有的表都做一次ANALYZE操作,可以用mysqlcheck命令:

过程:

完成。

MySQL分析表、检查表和优化表

  1. 对表进行优化 ( 优化表主要作用是消除删除或者更新造成的空间浪费)

  2. 对表进行分析(分析关键字的分布, 分析并存储MyISAM和BDB表中键的分布)

  3. 对表进行检查(检查表的错误,并且为MyISAM更新键的统计内容)

  4. 对表进行修复(修复被破坏的MyISAM表)

Analyze Table

MySQL中使用ANALYZE TABLE语句来分析表,该语句的基本语法如下:

ANALYZE TABLE 表名1 [,表名2…] ;
使用ANALYZE TABLE分析表的过程中,数据库系统会对表加一个只读锁。在分析期间,只能读取表中的记录,不能更新和插入记录。ANALYZE TABLE语句能够分析InnoDB和MyISAM类型的表。

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取消写入。

【示例】 下面使用ANALYZE TABLE语句分析score表,分析结果如下:

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信dbaup66,谢谢!
AiDBA后续精彩内容已被站长无情隐藏,请输入验证码解锁本文!
验证码:
获取验证码: 请先关注本站微信公众号,然后回复“验证码”,获取验证码。在微信里搜索“AiDBA”或者“dbaup6”或者微信扫描右侧二维码都可以关注本站微信公众号。

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复