Rover12421's Blog

The End.

ANALYZE 和 CHECK

ANALYZE TABLE 和 CHECK TABLE 分别用来进行表分析和表检查。表分析主要用来获得关键字的分布情况,对执行计划的产生有帮助,而表检查主要用来检查表或者视图是否存在错误。

ANALYZE TABLE 用来分析和存储表的关键字的分布,使得系统获得准确的统计信息,影响 SQL 的执行计划的生成。对于数据基本没有发生变化的表,是不需要经常进行表分析的。但是如果表的数据量变化很明显,用户感觉实际的执行计划和预期的执行计划不同的时候,执行一次表分析可能有助于产生预期的执行计划。

表分析的语法是:

ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] …

这个命令对 MyISAM 、 BDB 、 InnoDB 存储引擎的表有作用。对于 MyISAM 存储引擎的表,这个命令的执行效果与 myisamchk – a 的执行效果相当。

下面是对表 test.test3 进行表分析的例子:

mysql> analyze table test3;

+-–-–-–-–+-–-–-–+-–-–-—+-–-–-—+

| Table | Op | Msg_type | Msg_text |

+-–-–-–-–+-–-–-–+-–-–-—+-–-–-—+

| test.test3 | analyze | status | OK |

+-–-–-–-–+-–-–-–+-–-–-—+-–-–-—+

1 row in set (0.14 sec)

CHECK TABLE 的作用是检查表或者视图是否存在错误,对 MyISAM 和 InnoDB 存储引擎的表有作用。对于 MyISAM 存储引擎的表进行表检查,也会同时更新关键字统计数据。

检查表的语法是:

CHECK TABLE tbl_name [, tbl_name] … [option] … option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}

下面我们的例子介绍的是当视图中引用的列被删除以后,检查视图会提示错误:

首先创建基于 test3 表的视图 test3_view :

mysql> desc test3;

+-–-—+-–-–-–-—+-–-–+-—-+-–-–-–+-–-—+

| Field | Type | Null | Key | Default | Extra |

+-–-—+-–-–-–-—+-–-–+-—-+-–-–-–+-–-—+

| id | int(3) | NO | PRI | NULL | |

| name | varchar(64) | NO | | | |

| age | int(11) | YES | | NULL | |

+-–-—+-–-–-–-—+-–-–+-—-+-–-–-–+-–-—+

3 rows in set (0.00 sec)

mysql> create view test3_view as select id,name,age from test3;

Query OK, 0 rows affected (0.03 sec)

检查视图 test3_view ,没有发现问题:

mysql> check table test3_view;

+-–-–-–-–-—-+-–-—+-–-–-—+-–-–-—+

| Table | Op | Msg_type | Msg_text |

+-–-–-–-–-—-+-–-—+-–-–-—+-–-–-—+

| test.test3_view | check | status | OK |

+-–-–-–-–-—-+-–-—+-–-–-—+-–-–-—+

1 row in set (1.50 sec)

删除 test3 表的 age 列:

mysql> alter table test3 drop column age;

Query OK, 862560 rows affected (5.69 sec)

Records: 862560 Duplicates: 0 Warnings: 0

再进行表检查,则会提示错误:

mysql> check table test3_view \G

*********\* 1. row **********

Table: test.test3_view

Op: check

Msg_type: Error

Msg_text: Unknown column ‘test.test3.age’ in ‘field list’

*********\* 2. row **********

Table: test.test3_view

Op: check

Msg_type: Error

Msg_text: View ‘test.test3_view’ references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them

*********\* 3. row **********

Table: test.test3_view

Op: check

Msg_type: error

Msg_text: Corrupt

3 rows in set (0.00 sec)

本文来源:http://www.unix-center.net

Comments