Wednesday, September 8, 2010

MySQL性能优化9 - ANALYZE 和 CHECK

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

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

表分析的语法是:
[cc lang="mysql"]ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...[/cc]

这个命令对 MyISAM 、 BDB 、 InnoDB 存储引擎的表有作用。对于 MyISAM 存储引擎的表,这个命令的执行效果与 [cci lang="text"]myisamchk – a[/cci] 的执行效果相当。

下面是对表 test.test3 进行表分析的例子:
[cc lang="mysql"]mysql> analyze table test3;

+------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+------------+---------+----------+----------+
| test.test3 | analyze | status | OK |
+------------+---------+----------+----------+

1 row in set (0.14 sec)[/cc]
[cci lang="mysql"]CHECK TABLE[/cci] 的作用是检查表或者视图是否存在错误,对 MyISAM 和 InnoDB 存储引擎的表有作用。对于 MyISAM 存储引擎的表进行表检查,也会同时更新关键字统计数据。

检查表的语法是:
[cc lang="mysql"]CHECK TABLE tbl_name [, tbl_name] ... [option] ... option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}[/cc]
下面我们的例子介绍的是当视图中引用的列被删除以后,检查视图会提示错误:

首先创建基于 test3 表的视图 test3_view :
[cc lang="mysql"]
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)[/cc]
检查视图 test3_view ,没有发现问题:
[cc lang="mysql"]
mysql> check table test3_view;

+-----------------+-------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+-----------------+-------+----------+----------+
| test.test3_view | check | status | OK |
+-----------------+-------+----------+----------+

1 row in set (1.50 sec)[/cc]
删除 test3 表的 age 列:
[cc lang="mysql"]
mysql> alter table test3 drop column age;

Query OK, 862560 rows affected (5.69 sec)

Records: 862560 Duplicates: 0 Warnings: 0[/cc]
再进行表检查,则会提示错误:
[cc lang="mysql"]
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)[/cc]

No comments:

Post a Comment