• 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_viewG;
    *************************** 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在执行期间将对表进行锁定,因此请注意这些操作要在数据库不繁忙的时候执行
  • 相关阅读:
    CVS,GIT,Mercurial和SVN比较
    ubuntu-使用终端配置网络
    编写简单的hashCode方法
    编写高质量equals方法
    文件上传和下载
    Java常用命令
    增删查改-MySQL
    Newton迭代法-C++
    二分法-C++
    适配器模式
  • 原文地址:https://www.cnblogs.com/wayne173/p/4442093.html
Copyright © 2020-2023  润新知