加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MYSQL数据库MySQL定期分析检查与优化表的方法小结

发布时间:2020-12-12 01:24:03 所属栏目:MySql教程 来源:网络整理
导读:《MYSQL数据库MySQL定期分析检查与优化表的方法小结》要点: 本文介绍了MYSQL数据库MySQL定期分析检查与优化表的方法小结,希望对您有用。如果有疑问,可以联系我们。 定期分析表 MYSQL入门 ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [,tbl_name

《MYSQL数据库MySQL定期分析检查与优化表的方法小结》要点:
本文介绍了MYSQL数据库MySQL定期分析检查与优化表的方法小结,希望对您有用。如果有疑问,可以联系我们。

定期分析表MYSQL入门

ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [,tbl_name]MYSQL入门

本语句用于分析和存储表的关键字分布.在分析期间,使用一个读取锁定对表进行锁定.这对于MyISAM,BDB和InnoDB表有作用.对于MyISAM表,本语句与使用myisamchk -a相当.MYSQL入门

MySQL使用已存储的关键字分布来决定,当您对除常数以外的对象执行联合时,表按什么顺序进行联合.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)MYSQL入门

定期检查表MYSQL入门

CHECK TABLE tbl_name [,tbl_name]? [option]MYSQL入门

option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}
检查一个或多个表是否有错误.CHECK TABLE对MyISAM和InnoDB表有作用.对于MyISAM表,关键字统计数据被更新.MYSQL入门

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入门

mysql> create view a_view as select * from a;
Query OK,0 rows affected (0.02 sec)MYSQL入门

然后CHECK一下该视图,发现没有问题MYSQL入门

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入门

mysql> drop table a;
Query OK,0 rows affected (0.01 sec)
再CHECK一下刚才的视图,发现报错了MYSQL入门

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)MYSQL入门

ERROR:
No query specified
定期优化表MYSQL入门

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入门

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)MYSQL入门

****
以上某些的段落是直接摘自MySQL的中文手册,详细可以直接查看MySQL的帮助手册,这里只是简单指出几种定期优化的方式,需要注意的是无论是ANALYZE,CHECK还是OPTIMIZE在执行期间将对表进行锁定,因此请注意这些操作要在数据库不繁忙的时候执行MYSQL入门

****
参考
《MySQL 5.1参考手册》MYSQL入门

by 陈于MYSQL入门

show table status
mysql官方文档在MYSQL入门

http://dev.mysql.com/doc/refman/5.1/en/show-table-status.htmlMYSQL入门

这里的rows行是表的行数,但是实际上是不准的.myisam是准的,其他的存储引擎是不准的.要准确的行数就需要使用count(*) 来获取了.MYSQL入门

mysql执行大批量删除
执行大批量删除的时候注意要使用上limitMYSQL入门

因为如果不用limit,删除大量数据很有可能造成死锁MYSQL入门

如果delete的where语句不在索引上,可以先找主键,然后根据主键删除数据库MYSQL入门

ps: 平时update和delete的时候最好也加上limit 1 来防止误操作MYSQL入门

optimize、Analyze、check、repair维护操作MYSQL入门

optimize 数据在插入,更新,删除的时候难免一些数据迁移,分页,之后就出现一些碎片,久而久之碎片积累起来影响性能,这就需要DBA定期的优化数据库减少碎片,这就通过optimize命令.MYSQL入门

如对MyisAM表操作:optimize table 表名MYSQL入门

对于InnoDB表是不支持optimize操作,否则提示“Table does not support optimize,doing recreate + analyze instead”,当然也可以通过命令:alter table one type=innodb; 来替代.MYSQL入门

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

Analyze table 表名MYSQL入门

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

Repair optimize需要有足够的硬盘空间,否则可能会破坏表,导致不能操作,那就要用上repair,注意INNODB不支持repair操作
生成乱序的id
方法:MYSQL入门

使用预设表MYSQL入门

比如id和toid的映射MYSQL入门

其中id是固定的,toid是随机的.MYSQL入门

然后在redis或memcache中记录一个指针值,指向idMYSQL入门

当要获取一个新toid的时候,取出指针值,加1,然后去预设表中获取toidMYSQL入门

查询和索引
查询的时候必须要考虑到如何命中索引MYSQL入门

比如有几个小招:MYSQL入门

1 不要在索引列中使用表达式MYSQL入门

where mycol *2 < 4MYSQL入门

2 不要在like模式的开始位置使用通配符%MYSQL入门

where col_name like ‘%string%'MYSQL入门

不如MYSQL入门

where col_name like ‘string%'MYSQL入门

3 避免过多使用mysql自动转换类型,有可能无法用到indexMYSQL入门

比如MYSQL入门

select * from mytbl where str_col=4MYSQL入门

但是str_col为字符串,这里其实就隐含了字符串变化MYSQL入门

应该使用MYSQL入门

select * from mytbl where str_col='4'MYSQL入门

索引比表还大就不需要建立索引了吗
MYSQL入门

索引是按照顺序排列的.所以即使索引比表大,也是可以加快查询速度的.MYSQL入门

当然如果索引比表还大首要的任务必须是检查下索引建立地是否有问题MYSQL入门

Char和varchar如何选择
char是定长,varchar变长
varchar除了设置了数据之外,还多使用1两个字节定义了数据实际长度.MYSQL入门

char会在后面空余的行填充上空字符串MYSQL入门

myisam建议使用char.myisam中有个静态表的概念.使用char比使用varchar的查询效率高很多.MYSQL入门

innodb建议使用varchar.主要是从节省空间的方面考虑MYSQL入门

多个TimeStamp设置默认值
一个表中至多只能有一个字段设置CURRENT_TIMESTAMPMYSQL入门

对于下面的需求:MYSQL入门

一个表中,有两个字段,createtime和updatetime.MYSQL入门

1 当insert的时候,sql两个字段都不设置,会设置为当前的时间
2 当update的时候,sql中两个字段都不设置,updatetime会变更为当前的时间MYSQL入门

这样的需求是做不到的.因为你无法避免在两个字段上设置CURRENT_TIMESTAMP?MYSQL入门

解决办法有几个:MYSQL入门

1 使用触发器.MYSQL入门

2 将第一个timestamp的default设置为0MYSQL入门

3 老老实实在sql语句中使用时间戳.MYSQL入门

/article/31872.htmMYSQL入门

查询数据表有多少行,多少容量
不要使用select count(*)MYSQL入门

使用show table status like ‘table_name'? 但是innodb的话会有50%左右的浮动,是个预估值MYSQL入门

AUTO_INCREMENT的设置MYSQL入门

1 不要设置为int,请设置为unsinged int,auto_increment的范围是根据类型来判定的
2 auto_increment数据列必须要有索引,并且保证唯一性.
3 auto_increment必须有NOT NULL属性
4 auto_increment可以使用MYSQL入门

UPDATE table SET seq = LAST_INSERT_ID(seq -1)MYSQL入门

mysql的表示时间的字段用什么类型
表示时间可以使用timestamp和datetime来使用MYSQL入门

datetime表示的时间可以从0000-00-00:00:00 到9999-12-31:00:00:00MYSQL入门

timestamp表示的时间为1970-01-01 08:00:01到2038-01-19 11:14:07MYSQL入门

timestamp占用的空间比datetime少,且可以设置时区等功能,所以能使用timestamp的地方尽量使用timestampMYSQL入门

使用timestamp还可以设置MYSQL入门

[ON UPDATE CURRENT_TIMESTAMP]MYSQL入门

[DEFAULT CURRENT_TIMESTAMP]MYSQL入门

myisam和innodb支持外键
myisam不支持外键,innodb支持;MYSQL入门

如果你使用创建外键的命令对myisam的表操作,操作不会返回失败,但是是没有外键关联建立起来的.MYSQL入门

对一个字段加减语句
经常有需求对一个字段加减会使用MYSQL入门

update table set a = a+1MYSQL入门

这样是对的MYSQL入门

但是如果这样设置:MYSQL入门

select a from tableMYSQL入门

取出数据后a为1MYSQL入门

update table set a =2MYSQL入门

这样会导致如果在select和update之间有其他事务操作修改这个字段的话,导致最后的设置可能出错.MYSQL入门

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读