- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章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) 。
**** 以上某些的段落是直接摘自MySQL的中文手册,详细可以直接查看MySQL的帮助手册,这里只是简单指出几种定期优化的方式,需要注意的是无论是ANALYZE,CHECK还是OPTIMIZE在执行期间将对表进行锁定,因此请注意这些操作要在数据库不繁忙的时候执行 。
**** 参考 《MySQL 5.1参考手册》 。
by 陈于喆 。
show table status mysql官方文档在 。
http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html 。
这里的rows行是表的行数,但是实际上是不准的。myisam是准的,其他的存储引擎是不准的。要准确的行数就需要使用count(*) 来获取了.
mysql执行大批量删除 执行大批量删除的时候注意要使用上limit 。
因为如果不用limit,删除大量数据很有可能造成死锁 。
如果delete的where语句不在索引上,可以先找主键,然后根据主键删除数据库 。
ps: 平时update和delete的时候最好也加上limit 1 来防止误操作 。
optimize、Analyze、check、repair维护操作 。
optimize 数据在插入,更新,删除的时候难免一些数据迁移,分页,之后就出现一些碎片,久而久之碎片积累起来影响性能,这就需要DBA定期的优化数据库减少碎片,这就通过optimize命令.
如对MyisAM表操作:optimize table 表名 。
对于InnoDB表是不支持optimize操作,否则提示“Table does not support optimize, doing recreate + analyze instead”,当然也可以通过命令:alter table one type=innodb; 来替代.
Analyze 用来分析和存储表的关键字的分布,使得系统获得准确的统计信息,影响 SQL 的执行计划的生成。对于数据基本没有发生变化的表,是不需要经常进行表分析的。但是如果表的数据量变化很明显,用户感觉实际的执行计划和预期的执行计划不 同的时候,执行一次表分析可能有助于产生预期的执行计划.
Analyze table 表名 。
Check检查表或者视图是否存在错误,对 MyISAM 和 InnoDB 存储引擎的表有作用。对于 MyISAM 存储引擎的表进行表检查,也会同时更新关键字统计数据 。
Repair optimize需要有足够的硬盘空间,否则可能会破坏表,导致不能操作,那就要用上repair,注意INNODB不支持repair操作 生成乱序的id 方法:
使用预设表 。
比如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如何选择 char是定长,varchar变长 varchar除了设置了数据之外,还多使用1两个字节定义了数据实际长度.
char会在后面空余的行填充上空字符串 。
myisam建议使用char。myisam中有个静态表的概念。使用char比使用varchar的查询效率高很多.
innodb建议使用varchar。主要是从节省空间的方面考虑 。
多个TimeStamp设置默认值 一个表中至多只能有一个字段设置CURRENT_TIMESTAMP 。
对于下面的需求:
一个表中,有两个字段,createtime和updatetime.
1 当insert的时候,sql两个字段都不设置,会设置为当前的时间 2 当update的时候,sql中两个字段都不设置,updatetime会变更为当前的时间 。
这样的需求是做不到的。因为你无法避免在两个字段上设置CURRENT_TIMESTAMP 。
解决办法有几个:
1 使用触发器.
2 将第一个timestamp的default设置为0 。
3 老老实实在sql语句中使用时间戳.
查询数据表有多少行,多少容量 不要使用select count(*) 。
使用show table status like ‘table_name' 但是innodb的话会有50%左右的浮动,是个预估值 。
AUTO_INCREMENT的设置 。
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) 。
mysql的表示时间的字段用什么类型 表示时间可以使用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不支持外键,innodb支持; 。
如果你使用创建外键的命令对myisam的表操作,操作不会返回失败,但是是没有外键关联建立起来的.
对一个字段加减语句 经常有需求对一个字段加减会使用 。
update table set a = a+1 。
这样是对的 。
但是如果这样设置:
select a from table 。
取出数据后a为1 。
update table set a =2 。
这样会导致如果在select和update之间有其他事务操作修改这个字段的话,导致最后的设置可能出错.
最后此篇关于MySQL定期分析检查与优化表的方法小结的文章就讲到这里了,如果你想了解更多关于MySQL定期分析检查与优化表的方法小结的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一台 MySQL 服务器和一台 PostgreSQL 服务器。 需要从多个表中复制或重新插入一组数据 MySQL 流式传输/同步到 PostgreSQL 表。 这种复制可以基于时间(Sync)或事
如果两个表的 id 彼此相等,我尝试从一个表中获取数据。这是我使用的代码: SELECT id_to , email_to , name_to , status_to
我有一个 Excel 工作表。顶行对应于列名称,而连续的行每行代表一个条目。 如何将此 Excel 工作表转换为 SQL 表? 我使用的是 SQL Server 2005。 最佳答案 这取决于您使用哪
我想合并两个 Django 模型并创建一个模型。让我们假设我有第一个表表 A,其中包含一些列和数据。 Table A -------------- col1 col2 col3 col
我有两个表:table1,table2,如下所示 table1: id name 1 tamil 2 english 3 maths 4 science table2: p
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 1 年前。 Improve th
下面两个语句有什么区别? newTable = orginalTable 或 newTable.data(originalTable) 我怀疑 .data() 方法具有性能优势,因为它在标准 AX 中
我有一个表,我没有在其中显式定义主键,它并不是真正需要的功能......但是一位同事建议我添加一个列作为唯一主键以随着数据库的增长提高性能...... 谁能解释一下这是如何提高性能的? 没有使用索引(
如何将表“产品”中的产品记录与其不同表“图像”中的图像相关联? 我正在对产品 ID 使用自动增量。 我觉得不可能进行关联,因为产品 ID 是自动递增的,因此在插入期间不可用! 如何插入新产品,获取产品
我有一个 sql 表,其中包含关键字和出现次数,如下所示(尽管出现次数并不重要): ____________ dog | 3 | ____________ rat | 7 | ____
是否可以使用目标表中的LAST_INSERT_ID更新源表? INSERT INTO `target` SELECT `a`, `b` FROM `source` 目标表有一个自动增量键id,我想将其
我正在重建一个搜索查询,因为它在“我看到的”中变得多余,我想知道什么 (albums_artists, artists) ( ) does in join? is it for boosting pe
以下是我使用 mysqldump 备份数据库的开关: /usr/bin/mysqldump -u **** --password=**** --single-transaction --databas
我试图获取 MySQL 表中的所有行并将它们放入 HTML 表中: Exam ID Status Assigned Examiner
如何查询名为 photos 的表中的所有记录,并知道当前用户使用单个查询将哪些结果照片添加为书签? 这是我的表格: -- -- Table structure for table `photos` -
我的网站都在 InnoDB 表上运行,目前为止运行良好。现在我想知道在我的网站上实时发生了什么,所以我将每个页面浏览量(页面、引荐来源网址、IP、主机名等)存储在 InnoDB 表中。每秒大约有 10
我在想我会为 mysql 准备两个表。一个用于存储登录信息,另一个用于存储送货地址。这是传统方式还是所有内容都存储在一张表中? 对于两个表...有没有办法自动将表 A 的列复制到表 B,以便我可以引用
我不是程序员,我从这个表格中阅读了很多关于如何解决我的问题的内容,但我的搜索效果不好 我有两张 table 表 1:成员 id*| name | surname -------------------
我知道如何在 ASP.NET 中显示真实表,例如 public ActionResult Index() { var s = db.StaffInfoDBSet.ToList(); r
我正在尝试运行以下查询: "insert into visits set source = 'http://google.com' and country = 'en' and ref = '1234
我是一名优秀的程序员,十分优秀!