对于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下的操作的更多相关文章

  1. 浅谈MySQL中优化sql语句查询常用的30种方法 - 转载

    浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使 ...

  2. 浅谈mysql中不同事务隔离级别下数据的显示效果

    事务的概念 事 务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查 询语句因为崩溃或其他原因而无法执行,那 ...

  3. 浅谈mysql中varchar(m)与char(n)的区别与联系

    mysql建表长度的限制 在mysql建表时,出现以下报错信息: 错误一:行大小过大,所使用的表这种类型的最大的行大小,不算BLOB类型,是65535.(这是我翻译的)    原因是MySQL在建表的 ...

  4. 浅谈MySQL中的查询优化

    mysql的性能优化包罗甚广: 索引优化,查询优化,查询缓存,服务器设置优化,操作系统和硬件优化,应用层面优化(web服务器,缓存)等等.这里的记录的优化技巧更适用于开发人员,都是从网络上收集和自己整 ...

  5. 浅谈mysql中各种表空间(tablespaces)的概念

    mysql中,会涉及到各种表空间的概念,虽然,很多方面这些概念和Oracle有相似性,但也有很多不同的地方,初学者很容易被这些概念弄的晕头转向,从而,混淆这些概念的区别和理解,下面,就简要介绍和说明一 ...

  6. 浅谈mysql中utf8和utf8mb4区别

    转自:http://ourmysql.com/archives/1402  实践过程中发现有时mysql的字符集会引起故障,所以需要了解下这个知识点. 一.简介 MySQL在5.5.3之后增加了这个u ...

  7. 浅谈Oracle中物理结构(数据文件等。。。)与逻辑结构(表空间等。。。。。)

    初始Oracle时很难理解其中的物理结构和逻辑结构,不明白内存中和硬盘中文件的区别和联系,我也是初学Oracle,这里就简单的谈谈我我看法. 首先,你需要明白的一点是:数据库的物理结构是由数据库的操作 ...

  8. 浅谈 Mysql 中的索引

    文章归属:http://feiyan.info/16.html,我想自己去写了,但是发现此君总结的非常详细.直接搬过来了 关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基 ...

  9. 浅谈MySQL中优化sql语句查询常用的30种方法

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索 ...

随机推荐

  1. Android基础TOP5_2:MultiAutoCompleteTextView多文本自动补全文本框

    Activity: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmln ...

  2. 循环插入记录,id每次加1

    sql语句写法: begin for i in 1 .. 100 loop insert into table_name values(....); end loop; commit; end; 例子 ...

  3. 本地调试hbase

    需求说明 如果要本地调试Hbase程序,那么可以用本地连接集群的方式 配置文件 在maven里,配置文件cluster.properties放在target/classes里 cluster.prop ...

  4. python学习笔记(6)——字典(Dictionary)

    dict= {key1 : value1, key2 : value2 ...} 关键词:字典中元素成对出现- key:value 格式- 两端{ } ,键:值,每对键值间用 ,隔开. 键key-唯一 ...

  5. struts2特殊符号替换

    今天用struts2做了一个小例子,结果发现个问题 action代码如下 private String table; public String execute(){ setName("pe ...

  6. 【sqli-labs】 less64 GET -Challenge -Blind -130 queries allowed -Variation3 (GET型 挑战 盲注 只允许130次查询 变化3)

    双括号整型 http://192.168.136.128/sqli-labs-master/Less-64/?id=1)) or ((1

  7. 04Oracle Database 登陆

    Oracle Database 登陆 EM Express Login https://localhost:5500/em/login cmd sqlplus SQL/PLUS system/code ...

  8. Python之UDP编程

    参考原文 廖雪峰Python教程 TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据.相对TCP,UDP则是面向无连接的协议. 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口 ...

  9. block的作用

    ios高效开发--blocks相关   1.替换delegate       如果我们有2个viewController,a和b,当我们从a界面push到b后,在b上面触发了一些事件,这些时间又会影响 ...

  10. <Zookeeper>入门 概念

    分布式协调服务 Zookeeper 分布式环境的特点 1.分布性 基于一个硬件或者多个硬件设备以及多个软件组成的分布在不同网络计算机上的系统架构,通过消息传递进行通信协调.在空间上部署是可以任意的,网 ...