解析mysql 表中的碎片产生原因以及清理

大量删除数据必然会在数据文件中造成不连续的空白空间,而当插入数据时,这些空白空间则会被利用起来 。
对于不同的存储引擎整理碎片的方式不一样。
myisam
可以有以下方式:
mysql> show table status from test like 'testusers'\G
*************************** 1. row ***************************
  ....
           Rows: 3
 Avg_row_length: 45
         Data_free: 40
.....
因为在中间删除,所以留下了空白
mysql> optimize table testusers;
+----------------+----------+----------+----------+
| Table          | Op       | Msg_type | Msg_text |
+----------------+----------+----------+----------+
| test.testusers | optimize | status   | OK       |
+----------------+----------+----------+----------+
1 row in set (0.00 sec)
mysql> show table status from test like 'testusers'\G
*************************** 1. row ***************************
   ...
           Rows: 3
 Avg_row_length: 32
    Data_length: 96
      Data_free: 0
1 row in set (0.00 sec)
在optimize后,Data_free已经变为0.碎片数据被清除。
同样还可以用以下方式,效果和optimize一样
./bin/mysqlcheck  -uroot -proot --socket=./tmp/mysql.sock  -o test testusers
innodb
对于innodb 使用optimize和mysqlcheck都不起作用,可以如下进行
对于小表的话直接用ALTER TABLE table_name ;回收表空间,对于大表就不能直接采用这种方式,因为会造成长时间的锁表。可以采用新建表转移数据,然后删除旧表的形式,然后再重命名表。

另外有个python可以查看innodb表空间信息,可以在网上找哈,用python写的。

(0)

相关推荐

  • MySQL 清除表空间碎片的实例详解

    MySQL 清除表空间碎片的实例详解 碎片产生的原因 (1)表的存储会出现碎片化,每当删除了一行内容,该段空间就会变为空白.被留空,而在一段时间内的大量删除操作,会使这种留空的空间变得比存储列表内容所使用的空间更大: (2)当执行插入操作时,MySQL会尝试使用空白空间,但如果某个空白空间一直没有被大小合适的数据占用,仍然无法将其彻底占用,就形成了碎片: (3)当MySQL对数据进行扫描时,它扫描的对象实际是列表的容量需求上限,也就是数据被写入的区域中处于峰值位置的部分: 例如: 一个表有1万行

  • mysql sharding(碎片)介绍

    1.Sharding 的应用场景一般都那些? 当数据库中的数据量越来越大时,不论是读还是写,压力都会变得越来越大.试想,如果一张表中的数据量达到了千万甚至上亿级别的时候,不管是建索引,优化缓存等,都会面临巨大的性能压力.sharding通过某种条件,把同一个数据库中的数据分散到多个数据库或多台机器上,以减小单台机器压力. 联机游戏.IM.BSP 都是比较适合 Sharding 的应用场景: 2.Sharding与数据库分区(Partition)的区别? sharding实现了数据的分布式部署,将

  • 解析mysql 表中的碎片产生原因以及清理

    大量删除数据必然会在数据文件中造成不连续的空白空间,而当插入数据时,这些空白空间则会被利用起来 .对于不同的存储引擎整理碎片的方式不一样.myisam可以有以下方式:mysql> show table status from test like 'testusers'\G*************************** 1. row ***************************  ....           Rows: 3 Avg_row_length: 45        

  • mysql数据库中字符集乱码问题原因及解决

    前言 有的时候我们在查看数据库数据时,会看到乱码.实际上,无论何种数据库只要出现乱码问题,这大多是由于数据库字符集设定的问题. 下面我们就介绍一下,数据库的字符集的设定及乱码问题的解决. mysql数据库的字符集 直白的说,字符就像是单个的文字,编码就像是给每个文字的编号,字符集就像是字符与编码的集合,校验规则就是字符集的对应的排序规则,字符集加上对应的校验规则就是语言.(每种字符集可以有多种校对规则,但都有一个默认的校对规则) mysql数据库可以通过设定字符集,来使用对应的字符集和检验规则来

  • 用shell脚本在mysql表中批量插入数据的方法

    很多时候需要在mysql表中插入大量测试数据,下面分享一个用shell脚本通过while循环批量生成mysql测试数据的方法,你只需要根据你自己的表结构来生成sql语句即可. 复制代码 代码如下: #!/bin/bash i=1;MAX_INSERT_ROW_COUNT=$1;while [ $i -le $MAX_INSERT_ROW_COUNT ]do    mysql -uroot -proot afs -e "insert into afs_test (name,age,createTi

  • 将数据插入到MySQL表中的详细教程

    将数据插入到MySQL表,需要使用SQL INSERT INTO命令.可以将数据插入到MySQL表使用mysql>提示符下或使用任何脚本,如PHP. 语法: 下面是通用的SQL语法INSERT INTO命令来插入数据到MySQL表: INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN ); 要插入的字符串数据类型,所有的值需要双或单引号,例如: - "value"

  • 深度解析 注册表修复不成功的原因

    道高一尺,魔高一丈,恶意网页的卑鄙手段可谓是"推陈出新"啊.用一些简单的注册表修复方法后,已经不能完全解决问题了.如果你的注册表在恢复后又回到了被修改的老样子,不妨看看是否是以下原因引起的呢? 1.修改注册表禁止命令形式的修改,目的是不让用户通过注册表修复回去. 最通常的修改是锁住注册表,还有破坏关联:比如.reg,.vbs,.inf等. 关于解锁注册表,在前面已经介绍了方法,至于被修改关联,只要我前面说的注册表修改的方法里的关联还 能用,就可以用其中的任意一个,但如果.reg,.vb

  • MySQL表中添加时间戳的几种方法

    场景: 有张表的数据需要用同步工具同步至其他库,需要 update_time 时间戳字段 来做增量同步. 解决方法: alter table quant_stk_calc_d_wxcp add update_time timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们.

  • html中select语句读取mysql表中内容

    <?  $record=0;  $db=@mysql_pconnect('localhost','root');  @mysql_select_db('1234',$db);  $strsql="select * from 1234_data";  $result=@mysql_query($strsql);  $data=@mysql_fetch_array($result);  $record=@mysql_num_rows($result); echo "<

  • MySQL数据库表中的约束详解

    目录 MySQL表中的约束(constraint) 约束分类 非空约束 唯一性约束 复合约束 主键约束 自增列-AUTO_INCREMENT 外键约束FOREIGN KEY约束 CHECK约束 DEFAULT约束 MySQL表中的约束(constraint) 为了保证数据的完整性,(数据的精确性和可靠性) SQL规范以约束的方式对表数据进行额外的条件限制,可从以下四个方面进行考虑 实体完整性 域完整性 引用完整性 用户自定义完整性 约束?对表中字段的限制. 约束分类 约束作用字段的个数 单列约束

  • mysql表的清空、删除和修改操作详解

    一.清除mysql表中数据 delete from 表名; truncate table 表名; 不带where参数的delete语句可以删除mysql表中所有内容,使用truncate table也可以清空mysql表中所有内容. 效率上truncate比delete快,但truncate删除后不记录mysql日志,不可以恢复数据. delete的效果有点像将mysql表中所有记录一条一条删除到删完, 而truncate相当于保留mysql表的结构,重新创建了这个表,所有的状态都相当于新表.

  • MySQL 表数据的导入导出操作示例

    本文实例讲述了MySQL 表数据的导入导出操作.分享给大家供大家参考,具体如下: 数据导出 1.  使用 SELECT ...INTO OUTFILE ...命令来导出数据,具体语法如下. mysql> SELECT * FROM tablename INTO OUTFILE 'target_file' [option]; 其中 option 参数可以是以下选项: FIELDS TEMINATED BY 'string' (字符分断符) FIELDS [OPTIONALLY] ENCLOSED

随机推荐