数据库类型空间效率探索(三)-char
- 测试环境

- 表信息
表数据量22.23万,占用空间44.494M

- 用到的sql语句
增加列:alter table t_type add column new_column char(1) default null;
修改列:alter table t_type modify new_column char(200) default null;
删除列:alter table t_tpye drop column new_column;
表占用空间:
select concat(round(sum(data_length/1024/1024),3),'MB') as data_size,
concat(round(sum(max_data_length/1024/1024),3),'MB') as max_data_length,
concat(round(sum(data_free/1024/1024),3),'MB') as data_free,
concat(round(sum(index_length/1024/1024),3),'MB') as index_length
from information_schema.tables where table_name='t_type'
- 测试结果
见如下表格:
| 占用空间 | char(1) default null | char(50) default null | char(100) default null | char(200) default null |
| data_size(MB) | 45.123 | 44.922 | 44.922 | 44.922 |
| index_length(MB) | 2.256 | 2.256 | 2.256 | 2.256 |
| data_free(MB) | 0 | 0 | 0 | 0 |
| 占用空间 | char(1) not null default '' | char(50) not null default '' | char(100) not null default '' | char(200) not null default '' |
| data_size(MB) | 44.922 | 44.721 | 44.721 | 44.721 |
| index_length(MB) | 2.256 | 2.256 | 2.256 | 2.256 |
| data_free(MB) | 0 | 0 | 0 | 0 |
| 向new_column char(200) not null default ''插入字符N个a\啊 | |||||
| 占用空间\插入字符 | 1(a\啊) | 2(aa\啊啊) | 2(a啊/啊a) | 3(aaa/啊哈呵) | 35(a…a/啊…的/全半角混合) |
| data_size(MB) | 45.729\46.733 | 46.733\48.961 | 48.961/48.961 | 48.961/48.961 | 63.377/66.617/67.617 |
| index_length(MB) | 2.256 | 2.256 | 2.256 | 2.256 | 2.256 |
| data_free(MB) | 0 | 0 | 0 | 0 | 4.24 |
这个时候,当插入35个字符时,产生了奇怪的现象,看下面截图
- 重要步骤


可以看到,随着不断的更新字段中的数据,更新所耗费的时间逐渐增加(4.75->5.77->6.89->8.30),插入的最后一条数据(8.30sec),产生了4.240M的内存碎片。
优化表

优化后,表的大小明显减小,index_length也相应减小。
之前以为优化后的data_size为优化前的data_size减去data_free,看来不是这个样子。
通过上面的测试,对于char类型的字段,我得出了如下结论:
- 结论:
1、对于char类型,char(1)占用的空间反而比char(50)占用的多。
2、char(N)随着N的增多,表占用的空间并没有增大,这样就和N多大就分配多大的说法相矛盾。所以下面斜体字说法是错误的:
char类型时定长的类型,即当定义的是char(10),输入的是"abc"这三个字符时,它们占的空间一样是10个字节,包括7个空字节。
3、在更新大量数据的时候,如果插入次数过多(我测试的也不多,也就比上面摆出的多了三次),会严重影响mysql的插入速度与性能。
4、随着字段中数据量的增多,表占用的空间并不是一成不变的。而且也并没有根据插入字符所占字节的多少呈现符合常理的变化。
注:怪不得别人都说mysql是个坑,如果这样的话,这样就应该解决了前几天的那个疑问,也解决了我之前一直想不清楚的疑问。如何解决这个问题,还需要更深一步的研究一下mysql。
数据库类型空间效率探索(三)-char的更多相关文章
- 数据库类型空间效率探索(五)- decimal/float/double/varchar
以下测试为userinfo增加一列,列类型分别为decimal.float.double.varchar.由于innodb不支持optimize,所以每次测试,都会删除表test.userinfo,重 ...
- 数据库类型空间效率探索(四)-tinyint与enum与set
mysql> select count(*) from userinfo;+----------+| count(*) |+----------+| 115597 |+----------+1 ...
- 数据库时间内接受的是lang类型的时间 分为三种字段 第一种只存日期 第二种存日期+时间 第三种时间戳
数据库时间内接受的是lang类型的时间 分为三种字段 第一种只存日期 第二种存日期+时间 第三种时间戳
- ORACLE常用数据库类型(转)
oracle常用数据类型 1.Char 定长格式字符串,在数据库中存储时不足位数填补空格,它的声明方式如下CHAR(L),L为字符串长度,缺省为1,作为变量最大32767个字符,作为数据存储在ORAC ...
- {MySQL数据库初识}一 数据库概述 二 MySQL介绍 三 MySQL的下载安装、简单应用及目录介绍 四 root用户密码设置及忘记密码的解决方案 五 修改字符集编码 六 初识sql语句
MySQL数据库初识 MySQL数据库 本节目录 一 数据库概述 二 MySQL介绍 三 MySQL的下载安装.简单应用及目录介绍 四 root用户密码设置及忘记密码的解决方案 五 修改字符集编码 六 ...
- Oracle数据库类型
Oracle数据库类型 字符类型char[(length)] 定长字符 最长2000字节varchar2[(length)] 可变长度的字符数据类型,最长4000字节NCHAR[(length)] 固 ...
- Django---ORM的常用字段和自定义字段,DjangoORM字段与数据库类型对应,字段参数和Meta的参数,Django的admin操作,13中orm操作方法,单标的双下方法
Django---ORM的常用字段和自定义字段,DjangoORM字段与数据库类型对应,字段参数和Meta的参数,Django的admin操作,13中orm操作方法,单标的双下方法 一丶ORM常用字段 ...
- 数据库表空间收缩之pg_squeeze,pg_repack
数据库表空间收缩之pg_squeeze,pg_repack 目录 数据库表空间收缩之pg_squeeze,pg_repack pg_squeeze1.2 原理 优点 安装 使用 pgstattuple ...
- oracle数据库表空间追加数据库文件方法
oracle数据库表空间追加数据库文件方法 针对非大文件方式表空间,允许追加文件进行表空间的扩展,单个文件最大大小是32G 第一种方式:表空间增加数据文件 www.2cto.com 1 ...
随机推荐
- 使用MagicAJax的AjaxPanel时有时会弹出"Using the AjaxCallHelper write methods outside of an AjaxCall is not allowed."
------解决方案--------------------------------------------------------1.看下你的输出是不是包含在<ajax:AjaxPanel I ...
- 白鹭引擎 - 文本类型 ( TextField, )
1, 普通文本 class Main extends egret.DisplayObjectContainer { public constructor() { super(); this.addEv ...
- leetcode41
package main import ( "fmt" ) func firstMissingPositive(nums []int) int { m := make(map[in ...
- Java,AWTUtilities,eclipse报编译错误:Access restriction: The type 'AWTUtilities' is not API (restriction on required library 'C:\Program Files\Java\jre7\lib\rt.jar')
[场景]调用com.sun.awt.AWTUtilities时,eclipse提示编译错误: Access restriction: The type 'AWTUtilities' is not AP ...
- js判断网页是否加载完毕
1. document.onreadystatechange = function () { if(document.readyState=="complete") { docum ...
- Linux:客户端的实现
写了一个简单的服务器软件,但是没有写客户端.现在我将客户端实现了,其实昨天已经说了客户端的实现步骤了. 步骤: socket() 初始化 connet()链接 从标准输入读数据fgets() 传数据到 ...
- jQuery 知识体系
jQuery基础知识一 jQuery之知识二-选择器 [jQuery知识]jQuery之知识三-过滤器 [jQuery知识]jQuery之知识四-DOM和CSS操作 [jQuery知识]jQuery之 ...
- KVM虚拟化技术(二)KVM介绍
KVM:Kernel Virtual Machine KVM是基于虚拟化扩展的x86硬件,是Linux完全原生的全虚拟化解决方案.部分半虚拟化支持,主要是通过半虚拟网络驱动程序的形式用于Linux和W ...
- git工作操作步骤
上班开始,打开电脑,git pull:拉取git上最新的代码: 编辑代码,准备提交时,git stash:将自己编辑的代码暂存起来,防止git pull时与库中的代码起冲突,否则自己的代码就白敲了: ...
- DOM精简版笔记
1.1. 基本概念 1.1.1. DOM DOM Document Object Model 文档对象模型 就是把HTML文档模型化,当作对象来处理 DOM提供的一系列属性和方法可以 ...