辛星浅谈mysql中的数据碎片以及引擎为MyISAM下的操作
对于mysql中的数据碎片,事实上和我们删除数据是息息相关的,删除数据的时候必定会在数据文件里造成不连续的空白空间,对于少量的数据的删除,并不会产生多少的空白空间。假设在一段时间内的大量的删除操作,会使得这样的留空的空间变得比存储列表内容所使用的空间更大。
可能有人会说。我们向数据库中插入数据的时候,会不会在这些空白空间中插入数据呢?答案是会的。
可是,它会造成一个后果。那就是数据的存储位置不连续,以及物理存储顺序与理论上的存储顺序不同样,这就比較麻烦了。
依照数据碎片的大小来分,能够分为单行数据碎片和多行数据碎片。
事实上不只会产生数据碎片。假设加了索引,还会产生索引碎片,这样会造成顺序的紊乱。因为MySQL的引擎的内部实现机制不同,在数据碎片的处理上也会不同。
对于MyISAM来说,由于它的索引和数据以及表结构分为三个文件来存储,因此optimize能够整理数据文件,而且又一次排序。这样由于数据碎片产生的性能问题会降低非常多,直接使用【optimize table 表名】就可以,可是此时也应该注意一些问题。由于该操作会锁住表。所以我们尽量定期整理一下碎片,在訪问量小的时候来做这件事。
我们能够查看information_schema数据库下的tables中的free_data字段就可以,假设该字段不为0,则产生了数据碎片,看以下操作:
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use information_schema;
Database changed
mysql> select data_free from tables;
+-----------+
| data_free |
+-----------+
| 0 |
| 0 |
...中间省略部分数据
| 0 |
| 72 |
| 0 |
| 0 |
+-----------+
162 rows in set (0.06 sec) mysql>
这里我们是查看全部的表中的数据碎片。假设我们想单独看某一个表的数据碎片,看以下操作:
第一步,我们先建立一个库和一个表,并向当中插入四条数据:
mysql> create database xinxing;
Query OK, 1 row affected (0.16 sec) mysql> use xinxing;
Database changed mysql>
mysql> create table xin (c char(40)) engine = myisam;
Query OK, 0 rows affected (0.06 sec) mysql>
mysql> insert into xin values('xiaohei'),('xiaoqian'),
-> ('xiaolin'),('xiaonan');
Query OK, 4 rows affected (0.03 sec)
Records: 4 Duplicates: 0 Warnings: 0
第二步,我们查看这个表的信息:
mysql> show table status from xinxing \G
*************************** 1. row ***************************
Name: xin
Engine: MyISAM
Version: 10
Row_format: Fixed
Rows: 4
Avg_row_length: 121
Data_length: 484
Max_data_length: 34058472181989375
Index_length: 1024
Data_free: 0
Auto_increment: NULL
Create_time: 2014-08-25 13:19:02
Update_time: 2014-08-25 13:19:35
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
我们发现这里面并没有数据碎片。都是很严密的。
第三步,我们删除一条数据:
mysql> delete from xin where c = 'xiaolin';
Query OK, 1 row affected (0.00 sec)
第四步。我们再次查看,发现数据碎片产生了:
mysql> show table status from xinxing \G
*************************** 1. row ***************************
Name: xin
Engine: MyISAM
Version: 10
Row_format: Fixed
Rows: 3
Avg_row_length: 121
Data_length: 484
Max_data_length: 34058472181989375
Index_length: 1024
Data_free: 121
Auto_increment: NULL
Create_time: 2014-08-25 13:19:02
Update_time: 2014-08-25 13:20:15
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
我们发现上面的data_free字段为121,也就是产生了121字节的空白空间。
大家注意,我们这里仅仅是删除了一条数据。假设删除n条数据。那这些碎片就非常影响性能了,至于它的解决的方法,我们上面也提到了,这里就不再提了。
我是辛星。期待您的关注。
辛星浅谈mysql中的数据碎片以及引擎为MyISAM下的操作的更多相关文章
- 浅谈MySQL中优化sql语句查询常用的30种方法 - 转载
浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使 ...
- 浅谈mysql中不同事务隔离级别下数据的显示效果
事务的概念 事 务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查 询语句因为崩溃或其他原因而无法执行,那 ...
- 浅谈mysql中varchar(m)与char(n)的区别与联系
mysql建表长度的限制 在mysql建表时,出现以下报错信息: 错误一:行大小过大,所使用的表这种类型的最大的行大小,不算BLOB类型,是65535.(这是我翻译的) 原因是MySQL在建表的 ...
- 浅谈MySQL中的查询优化
mysql的性能优化包罗甚广: 索引优化,查询优化,查询缓存,服务器设置优化,操作系统和硬件优化,应用层面优化(web服务器,缓存)等等.这里的记录的优化技巧更适用于开发人员,都是从网络上收集和自己整 ...
- 浅谈mysql中各种表空间(tablespaces)的概念
mysql中,会涉及到各种表空间的概念,虽然,很多方面这些概念和Oracle有相似性,但也有很多不同的地方,初学者很容易被这些概念弄的晕头转向,从而,混淆这些概念的区别和理解,下面,就简要介绍和说明一 ...
- 浅谈mysql中utf8和utf8mb4区别
转自:http://ourmysql.com/archives/1402 实践过程中发现有时mysql的字符集会引起故障,所以需要了解下这个知识点. 一.简介 MySQL在5.5.3之后增加了这个u ...
- 浅谈Oracle中物理结构(数据文件等。。。)与逻辑结构(表空间等。。。。。)
初始Oracle时很难理解其中的物理结构和逻辑结构,不明白内存中和硬盘中文件的区别和联系,我也是初学Oracle,这里就简单的谈谈我我看法. 首先,你需要明白的一点是:数据库的物理结构是由数据库的操作 ...
- 浅谈 Mysql 中的索引
文章归属:http://feiyan.info/16.html,我想自己去写了,但是发现此君总结的非常详细.直接搬过来了 关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基 ...
- 浅谈MySQL中优化sql语句查询常用的30种方法
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索 ...
随机推荐
- C语言特殊知识点解析
1 数组 1.1 概念 数组是指某种数据类型,在内存上按照顺序存储.中括号([ ])是数组的标识,中括号内的数值标识该种数据类型变量的个数,中括号也有取值的作用. 1.2 数组使用 int a[10] ...
- springboot项目中,@transactional 无效
问题: springboot项目,依然是使用jpa.Hibernate来操作mysql,涉及到数据库的操作,就少不了事务.写了一个接口,用来测试@Transaction注解的作用,发现没有效果 分析: ...
- android studio java.io.IOException:setDataSourse fail.
这一次是针对Android开发中的一个小问题,权限获取的问题. 在写了一个一个小Android程序的时候,有时候普需要获取本机的文件(Audio&Video),这时候如果不加权限就会出现这种情 ...
- dwarfdump --arch=arm64 --lookup
解析友盟错误信息重要指令: dwarfdump --arch=arm64 --lookup 0x1001edbc4 /Users/zhoujunbo/Library/Developer/Xcode/A ...
- Java基础(六)--枚举Enum
枚举: 刚开始项目中没怎么用过,只知道能够实现作为项目中类似定义Constant的功能,然后知道枚举实现的单例模式几乎是最优雅的,所以, 想要深入完整的了解一下 1.基本特性: Enum.values ...
- ERROR: Field 'PostId' doesn't have a default value Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not execute statement
例子: Post p = new Post(); p.setPostId(3); p.setPostName("技术"); 在执行数据保持时提示session.save(p); 的 ...
- 「 HDU P3336 」 Count the string
题目大意 给出一个长度为 $n$ 的字符串 $s$ 要求你求出 $s$ 的每一个前缀在 $s$ 中出现的次数之和.$n\le 200000$. 解题思路 暴力的对每一个前缀进行一次匹配,求出出现次数后 ...
- eclipse 中常用快捷键
* 字母大小写转换 ctrl+shift+x 转为大写 ctrl+shift+y 转为小写 * eclipse 自动生成对象来接收方法的返回值的快捷键 说明:光标一定要定位到要自动生成返回值对 ...
- Billboard (HDU 2795)
Billboard (HDU 2795) Hdu 2795 注意到每个广告的长度是1,因此可以将每这一张广告牌当成一个数列表示,每个初始值为w.使用线段树维护这个数列,每次查询为找到这个数列第一个大于 ...
- orcad中注意的事情
1.地的标识不能放到已经分配了网络的线上. 在用orcad画原理图的时候,把电源放到网络的时候需要特别的注意,如果,将电源地直接放到线上,而这根线又已经被分配了网络标号,那这个地会随已经分配了的网络号 ...