MySQL按期分析检查与优化表

MySQL按期分析检查与优化表
听DBA的人说,相比oracle,MySQL就是一个玩具级别的数据库,DBA基本不多去管理到MySQL的东西,因此咱们产品使用到的MySQL的一些配置和优化仍是须要咱们开发人员本身动手,下面就简单介绍一下实用的按期优化方法
 
按期分析表
 
ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name]
 
本语句用于分析和存储表的关键字分布。在分析期间,使用一个 读取锁定对表进行锁定。这对于MyISAM, BDB和InnoDB表有做用。对于MyISAM表,本语句与使用myisamchk -a至关。
 
MySQL使用已存储的关键字分布来决定,当您对除常数之外的对象执行联合时,表按什么顺序进行联合。 
mysql> analyze table a;
+--------+---------+----------+-----------------------------+
| Table  | Op      | Msg_type | Msg_text                    |
+--------+---------+----------+-----------------------------+
| test.a | analyze | status   | Table is already up to date | 
+--------+---------+----------+-----------------------------+
1 row in set (0.00 sec)
 
按期检查表
 
CHECK TABLE tbl_name [, tbl_name]  [option] 
 
option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}
 
检查一个或多个表是否有错误。CHECK TABLE对MyISAM和InnoDB表有做用。对于MyISAM表,关键字统计数据被更新。
mysql> check table a;
+--------+-------+----------+----------+
| Table  | Op    | Msg_type | Msg_text |
+--------+-------+----------+----------+
| test.a | check | status   | OK       | 
+--------+-------+----------+----------+
1 row in set (0.00 sec)
 
CHECK TABLE也能够检查视图是否有错误,好比在视图定义中被引用的表已不存在。
咱们为上面的表a建立一个视图 
mysql> create view a_view as select * from a;
Query OK, 0 rows affected (0.02 sec)
 
而后CHECK一下该视图,发现没有问题
mysql> check table a_view;
+-------------+-------+----------+----------+
| Table       | Op    | Msg_type | Msg_text |
+-------------+-------+----------+----------+
| test.a_view | check | status   | OK       | 
+-------------+-------+----------+----------+
1 row in set (0.00 sec)
 
如今删掉视图依赖的表
mysql> drop table a;
Query OK, 0 rows affected (0.01 sec)
 
再CHECK一下刚才的视图,发现报错了
mysql> check table a_view\G;
*************************** 1. row ***************************
   Table: test.a_view
      Op: check
Msg_type: Error
Msg_text: Table 'test.a' doesn't exist
*************************** 2. row ***************************
   Table: test.a_view
      Op: check
Msg_type: Error
Msg_text: View 'test.a_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.a_view
      Op: check
Msg_type: error
Msg_text: Corrupt
3 rows in set (0.00 sec)
 
ERROR: 
No query specified
 
按期优化表
 
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] 
 
若是您已经删除了表的一大部分,或者若是您已经对含有可变长度行的表(含有VARCHAR, BLOB或TEXT列的表)进行了不少更改,则应使用OPTIMIZE TABLE。被删除的记录被保持在连接清单中,后续的INSERT操做会从新使用旧的记录位置。您可使用OPTIMIZE TABLE来从新利用未使用的空间,并整理数据文件的碎片。
在多数的设置中,您根本不须要运行OPTIMIZE TABLE。即便您对可变长度的行进行了大量的更新,您也不须要常常运行,每周一次或每个月一次便可,只对特定的表运行。
OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起做用。
对于MyISAM表,OPTIMIZE TABLE按以下方式操做:
若是表已经删除或分解了行,则修复表。
若是未对索引页进行分类,则进行分类。
若是表的统计数据没有更新(而且经过对索引进行分类不能实现修复),则进行更新。 
mysql> OPTIMIZE table a;
+--------+----------+----------+-----------------------------+
| Table  | Op       | Msg_type | Msg_text                    |
+--------+----------+----------+-----------------------------+
| test.a | optimize | status   | Table is already up to date | 
+--------+----------+----------+-----------------------------+
1 row in set (0.00 sec)
若是你只是对主库执行此操做,而且不想写到日志让从库也运行的话,能够加上参数 LOCAL 或者 NO_WRITE_TO_BINLOG 两个效果是同样的。 
 
****
 
须要注意的是不管是ANALYZE,CHECK仍是OPTIMIZE在执行期间将对表进行锁定,所以请注意这些操做要在数据库不繁忙的时候执行
相关文章
相关标签/搜索