MySQL之mysqlcheckcheck、optimize和analyze html
㈠ optimize
optimize能够回收空间、减小碎片、提升I/O
目前支持的存储引擎有:InnoDB、MyASIM和ARCHIVE
若是是Replication环境、可加NO_WRITE_TO_BINLOG(或者LOCAL、意思彻底相同)、好比:
optimize local table table_name;
mysql
如下是一个简单测试: 面试
[plain] view plain copy redis
㈡ check
检查表或视图的有无错误
支持表引擎有:InnoDB和MyISAM
下面简单模拟一个测试: sql
[plain] view plain copy shell
㈢ analyze
用于收集优化器统计信息、和tuning相关、
这个命令对 MyISAM、BDB、InnoDB 存储引擎的表有做用
若是不想记录到binlog、也可加关键字local或者另一个 数据库
[plain] view plain copy vim
分析表主要做用是分析关键字的分布。检查表主要做用是检查表是否存在错误。优化表主要做用是消除删除或者更新形成的空间浪费。本小节将为读者介绍分析表、检查表和优化表的方法。
1.分析表
MySQL中使用ANALYZE TABLE语句来分析表,该语句的基本语法以下:
ANALYZE TABLE 表名1 [,表名2…] ;
使用ANALYZE TABLE分析表的过程当中, 数据库 系统 会对表加一个只读锁。在分析期间,只能读取表中的记录,不能更新和插入记录。ANALYZE TABLE语句可以分析InnoDB和MyISAM类型的表。
【示例18-8】 下面使用ANALYZE TABLE语句分析score表,分析结果以下:
mysql > ANALYZE TABLE score;
+-------------+-----------+--------------+---------------+
| Table | Op | Msg_type | Msg_text |
+-------------+-----------+--------------+---------------+
| test.score | analyze | status | OK |
+-------------+-----------+--------------+---------------+
1 row in set (0.05 sec)
上面结果显示了4列信息,详细介绍以下:
Table:表示表的名称;
Op:表示执行的操做。analyze表示进行分析操做。check表示进行检查查找。optimize表示进行优化操做;
Msg_type:表示信息类型,其显示的值一般是状态、警告、错误和信息这四者之一;
Msg_text:显示信息。
检查表和优化表以后也会出现这4列信息。
2.检查表
MySQL中使用CHECK TABLE语句来检查表。CHECK TABLE语句可以检查InnoDB和MyISAM类型的表是否存在错误。并且,该语句还能够检查视图是否存在错误。该语句的基本语法以下:
CHECK TABLE 表名1 [,表名2…] [option] ;
其中,option参数有5个参数,分别是QUICK、FAST、CHANGED、MEDIUM和EXTENDED。这5个参数的执行效率依次下降。option选项只对MyISAM类型的表有效,对InnoDB类型的表无效。CHECK TABLE语句在执行过程当中也会给表加上只读锁。
3.优化表
MySQL中使用OPTIMIZE TABLE语句来优化表。该语句对InnoDB和MyISAM类型的表都有效。可是,OPTILMIZE TABLE语句只能优化表中的VARCHAR、BLOB或TEXT类型的字段。OPTILMIZE TABLE语句的基本语法以下:
OPTIMIZE TABLE 表名1 [,表名2…] ;
经过OPTIMIZE TABLE语句能够消除删除和更新形成的磁盘碎片,从而减小空间的浪费。OPTIMIZE TABLE语句在执行过程当中也会给表加上只读锁。
说明:若是一个表使用了TEXT或者BLOB这样的数据类型,那么更新、删除等操做就会形成磁盘空间的浪费。由于,更新和删除操做后,之前分配的磁盘空间不会自动收回。使用OPTIMIZE TABLE语句就能够将这些磁盘碎片整理出来,以便之后再利用。
服务器
按期分析表 微信
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)
****
须要注意的是不管是ANALYZE,CHECK仍是OPTIMIZE在执行期间将对表进行锁定,所以请注意这些操做要在 数据库 不繁忙的时候执行
****
2012-11-22 13:04 by 轩脉刃, 1318 阅读, 5 评论, 收藏, 编辑
mysql官方文档在
http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html
这里的rows行是表的行数,可是其实是不许的。myisam是准的,其余的存储引擎是不许的。要准确的行数就须要使用count(*) 来获取了。
执行大批量删除的时候注意要使用上limit
由于若是不用limit,删除大量数据颇有可能形成死锁
若是delete的where语句不在索引上,能够先找主键,而后根据主键删除数据库
ps: 平时update和delete的时候最好也加上limit 1 来防止误操做
l optimize 数据在插入,更新,删除的时候不免一些数据迁移,分页,以后就出现一些碎片,长此以往碎片积累起来影响性能,这就须要DBA按期的优化数据库减小碎片,这就经过optimize命令。
如对MyisAM表操做:optimize table 表名
对于InnoDB表是不支持optimize操做,不然提示“Table does not support optimize, doing recreate + analyze instead”,固然也能够经过命令:alter table one type=innodb; 来替代。
l Analyze 用来分析和存储表的关键字的分布,使得系统得到准确的统计信息,影响 SQL 的执行计划的生成。对于数据基本没有发生变化的表,是不须要常常进行表分析的。可是若是表的数据量变化很明显,用户感受实际的执行计划和预期的执行计划不 同的时候,执行一次表分析可能有助于产生预期的执行计划。
Analyze table 表名
l Check检查表或者视图是否存在错误,对 MyISAM 和 InnoDB 存储引擎的表有做用。对于 MyISAM 存储引擎的表进行表检查,也会同时更新关键字统计数据
l Repair optimize须要有足够的硬盘空间,不然可能会破坏表,致使不能操做,那就要用上repair,注意INNODB不支持repair操做
方法:
使用预设表
好比id和toid的映射
其中id是固定的,toid是随机的。
而后在redis或memcache中记录一个指针值,指向id
当要获取一个新toid的时候,取出指针值,加1,而后去预设表中获取toid
查询的时候必需要考虑到如何命中索引
好比有几个小招:
1 不要在索引列中使用表达式
where mycol *2 < 4
2 不要在like模式的开始位置使用通配符%
where col_name like ‘%string%’
不如
where col_name like ‘string%’
3 避免过多使用mysql自动转换类型,有可能没法用到index
好比
select * from mytbl where str_col=4
可是str_col为字符串,这里其实就隐含了字符串变化
应该使用
select * from mytbl where str_col=’4’
否
索引是按照顺序排列的。因此即便索引比表大,也是能够加快查询速度的。
固然若是索引比表还大首要的任务必须是检查下索引创建地是否有问题
char是定长,varchar变长
varchar除了设置了数据以外,还多使用1两个字节定义了数据实际长度。
char会在后面空余的行填充上空字符串
myisam建议使用char。myisam中有个静态表的概念。使用char比使用varchar的查询效率高不少。
innodb建议使用varchar。主要是从节省空间的方面考虑
一个表中至多只能有一个字段设置CURRENT_TIMESTAMP
对于下面的需求:
一个表中,有两个字段,createtime和updatetime。
1 当insert的时候,sql两个字段都不设置,会设置为当前的时间
2 当update的时候,sql中两个字段都不设置,updatetime会变动为当前的时间
这样的需求是作不到的。由于你没法避免在两个字段上设置CURRENT_TIMESTAMP
解决办法有几个:
1 使用触发器。
2 将第一个timestamp的default设置为0
3 老老实实在sql语句中使用时间戳。
http://www.cnblogs.com/yjf512/archive/2012/11/02/2751058.html
不要使用select count(*)
使用show table status like ‘table_name’ 可是innodb的话会有50%左右的浮动,是个预估值
1 不要设置为int,请设置为unsinged int,auto_increment的范围是根据类型来断定的
2 auto_increment数据列必需要有索引,而且保证惟一性。
3 auto_increment必须有NOT NULL属性
4 auto_increment可使用
UPDATE table SET seq = LAST_INSERT_ID(seq -1)
表示时间可使用timestamp和datetime来使用
datetime表示的时间能够从0000-00-00:00:00 到9999-12-31:00:00:00
timestamp表示的时间为1970-01-01 08:00:01到2038-01-19 11:14:07
timestamp占用的空间比datetime少,且能够设置时区等功能,因此能使用timestamp的地方尽可能使用timestamp
使用timestamp还能够设置
[ON UPDATE CURRENT_TIMESTAMP]
[DEFAULT CURRENT_TIMESTAMP]
myisam不支持外键,innodb支持;
若是你使用建立外键的命令对myisam的表操做,操做不会返回失败,可是是没有外键关联创建起来的。
常常有需求对一个字段加减会使用
update table set a = a+1
这样是对的
可是若是这样设置:
select a from table
取出数据后a为1
update table set a =2
这样会致使若是在select和update之间有其余事务操做修改这个字段的话,致使最后的设置可能出错。
mysqlcheck使用介绍 检查、修复、优化、分析表
官网: https://dev.mysql.com/doc/refman/5.7/en/mysqlcheck.html
一般使用该工具通常语法为:
好比对mysql库进行mysqlcheck操做:
实际上该工具是为了方便用户使用,而使用了CHECK TABLE、REPAIR TABLE、ANALYZE TABLE、OPTIMIZE TABLE语句。
--analyze选项:其实是执行了ANALYZE TABLE(支持InnoDB,MyISAM,NDB)
--check选项:其实是执行了CHECK TABLE(支持InnoDB,MyISAM,ARCHIVE,CSV)
--optimize选项:实际上执行了OPTIMIZE TABLE(支持InnoDB,MyISAM,ARCHIVE)
--repair选项:实际上执行REPAIR TABLE(支持MyISAM,ARCHIVE,CSV)
通常状况不须要加这些选项,除非须要修复
其余修改选项:
--repair --quick 尝试快速修复
--repair 正常修复(除非快速修复失败)
--repair --force 强行修复
固然,在mysqlcheck时,每张表会被加上READ LOCK。
跑 该进程时,尤为是大表,将会变得十分耗时。
且该工具必须在mysqld服务运行的状况下使用。
此外,部分存储引擎的表是不被支持的:
我创了四张表,其存储引擎分别为ARCHIVE、BLACKHOLE、MEMORY、MRG_MYISAM
而后check了一下,发现blackhole和memory是不被支持的,由于这两个存储引擎只存储.frm的表定义在磁盘上。
其余选项参考:
Format | Description | Introduced |
---|---|---|
--all-databases | Check all tables in all databases | |
--all-in-1 | Execute a single statement for each database that names all the tables from that database | |
--analyze | Analyze the tables | |
--auto-repair | If a checked table is corrupted, automatically fix it | |
--bind-address=ip_address | Use specified network interface to connect to MySQL Server | |
--character-sets-dir=path | Directory where character sets are installed | |
--check | Check the tables for errors | |
--check-only-changed | Check only tables that have changed since the last check | |
--check-upgrade | Invoke CHECK TABLE with the FOR UPGRADE option | |
--compress | Compress all information sent between client and server | |
--databases | Process all tables in the named databases | |
--debug[=debug_options] | Write a debugging log | |
--debug-check | Print debugging information when program exits | |
--debug-info | Print debugging information, memory, and CPU statistics when program exits | |
--default-auth=plugin | Authentication plugin to use | 5.6.2 |
--default-character-set=charset_name | Specify default character set | |
--defaults-extra-file=file_name | Read option file in addition to usual option files | |
--defaults-file=file_name | Read only named option file | |
--defaults-group-suffix=str | Option group suffix value | |
--extended | Check and repair tables | |
--fast | Check only tables that have not been closed properly | |
--fix-db-names | Convert database names to 5.1 format | |
--fix-table-names | Convert table names to 5.1 format | |
--force | Continue even if an SQL error occurs | |
--help | Display help message and exit | |
--host=host_name | Connect to MySQL server on given host | |
--login-path=name | Read login path options from .mylogin.cnf | 5.6.6 |
--medium-check | Do a check that is faster than an --extended operation | |
--no-defaults | Read no option files | |
--optimize | Optimize the tables | |
--password[=password] | Password to use when connecting to server | |
--pipe | On Windows, connect to server using named pipe | |
--plugin-dir=path | Directory where plugins are installed | 5.6.2 |
--port=port_num | TCP/IP port number to use for connection | |
--print-defaults | Print defaults | |
--protocol=type | Connection protocol to use | |
--quick | The fastest method of checking | |
--repair | Perform a repair that can fix almost anything except unique keys that are not unique | |
--secure-auth | Do not send passwords to the server in old (pre-4.1.1) format | 5.6.17 |
--shared-memory-base-name=name | The name of shared memory to use for shared-memory connections | |
--silent | Silent mode | |
--skip-database=db_name | Omit this database from performed operations | 5.6.11 |
--socket=path | For connections to localhost, the Unix socket file to use | |
--ssl | Enable SSL for connection | |
--ssl-ca=file_name | Path of file that contains list of trusted SSL CAs | |
--ssl-capath=dir_name | Path of directory that contains trusted SSL CA certificates in PEM format | |
--ssl-cert=file_name | Path of file that contains X509 certificate in PEM format | |
--ssl-cipher=cipher_list | List of permitted ciphers to use for SSL encryption | |
--ssl-crl=file_name | Path of file that contains certificate revocation lists | 5.6.3 |
--ssl-crlpath=dir_name | Path of directory that contains certificate revocation list files | 5.6.3 |
--ssl-key=file_name | Path of file that contains X509 key in PEM format | |
--ssl-verify-server-cert | Verify server Common Name value in its certificate against host name used when connecting to server | |
--tables | Overrides the --databases or -B option | |
--use-frm | For repair operations on MyISAM tables | |
--user=user_name, | MySQL user name to use when connecting to server | |
--verbose | Verbose mode | |
--version | Display version information and exit | |
--write-binlog | Log ANALYZE, OPTIMIZE, REPAIR statements to binary log. --skip-write-binlog adds NO_WRITE_TO_BINLOG to these statements. |
MySQL数据库mysqlcheck的使用方法的相关知识是本文咱们主要要介绍的内容,咱们知道,mysqlcheck,是mysql自带的能够检查和修复MyISAM表,而且它还能够优化和分析表,mysqlcheck的功能相似myisamchk,但其工做不一样。
主要差异是当mysqld服务器在运行时必须使用mysqlcheck,而myisamchk应用于服务器没有运行时。使用mysqlcheck的好处是不须要中止服务器来检查或修复表。使用myisamchk修复失败是不可逆的。
1.若是须要检查并修复全部的数据库的数据表,那么可使用:
# mysqlcheck -A -o -r -p
# Enter password:
database1 OK
database2 OK
2.若是须要修复指定的数据库用
# mysqlcheck -A -o -r Database_NAME -p
3.若是使用其余用户名修复
# mysqlcheck -A -o -r -p -u admin
这里admin是指定的mysql用户账号。
4.若是使用指定的mysql.sock进入数据库并修复
# mysqlcheck -A -o -r -p -S /tmp/mysql.sock
这里/tmp/mysql.sock是指定的mysql.sock存放的路径。
About Me
.............................................................................................................................................
● 本文做者:小麦苗,部份内容整理自网络,如有侵权请联系小麦苗删除
● 本文在itpub(http://blog.itpub.net/26736162/abstract/1/)、博客园(http://www.cnblogs.com/lhrbest)和我的微信公众号(xiaomaimiaolhr)上有同步更新
● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/
● 本文博客园地址:http://www.cnblogs.com/lhrbest
● 本文pdf版、我的简介及小麦苗云盘地址:http://blog.itpub.net/26736162/viewspace-1624453/
● 数据库笔试面试题库及解答:http://blog.itpub.net/26736162/viewspace-2134706/
● DBA宝典今日头条号地址:http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826
.............................................................................................................................................
● QQ群号:230161599(满)、618766405
● 微信群:可加我微信,我拉你们进群,非诚勿扰
● 联系我请加QQ好友(646634621),注明添加原因
● 于 2017-09-01 09:00 ~ 2017-09-30 22:00 在魔都完成
● 文章内容来源于小麦苗的学习笔记,部分整理自网络,如有侵权或不当之处还请谅解
● 版权全部,欢迎分享本文,转载请保留出处
.............................................................................................................................................
● 小麦苗的微店:https://weidian.com/s/793741433?wfr=c&ifr=shopdetail
● 小麦苗出版的数据库类丛书:http://blog.itpub.net/26736162/viewspace-2142121/
.............................................................................................................................................
使用微信客户端扫描下面的二维码来关注小麦苗的微信公众号(xiaomaimiaolhr)及QQ群(DBA宝典),学习最实用的数据库技术。
小麦苗的微信公众号 小麦苗的DBA宝典QQ群1 小麦苗的DBA宝典QQ群2 小麦苗的微店
.............................................................................................................................................
![]()
来自 “ ITPUB博客 ” ,连接:http://blog.itpub.net/26736162/viewspace-2144629/,如需转载,请注明出处,不然将追究法律责任。