数据库类型空间效率探索(三)-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 ...
随机推荐
- python中str的索引、切片
1 a = "hello" 2 a1 = a[1] 3 a2 = a[0:2] 4 print(a1) 5 print(a2) 我们通过索引获取字符串中指定位数的字符 通过切片获取 ...
- python中的clear
1 a = { 2 "name":"dlrb", 3 "age":25, 4 "height":168 5 } 6 a. ...
- kettle实现简单的增量同步
下载 pdi-ce-7.0.0.0-25.zip 解压 安装jdk 1.7以上的版本 配置环境变量 下载并将mysql-connector-java-5.1.39.jar 拷贝到 \data-inte ...
- pycharm中查找替换妙用
1.二行空格变一行(转载https://www.cnblogs.com/dreamfine/p/7760575.html) 网上COPY的代码,经常多出一个空行,不用一行行删除了,用替换功能吧,查找 ...
- leetcode1024
class Solution(object): def videoStitching(self, clips: 'List[List[int]]', T: int) -> int: li = s ...
- LeetCode 题解 56. Merge Intervals
题目大意:给出一组区间,合并他们. 首先是排序,首先看start,start小的在前面.start相同的话,end小的在前面. 排序以后,要合并了. 我自己的笨方法,说实在的问题真的很多.提交了好几次 ...
- P12, cer, provisioning profile
p12,本地私钥(实际上证书和私钥可以一起导出成p12,这里我们仅指私钥) cer,证书,即苹果签名后的公钥 provisioning profile描述文件 一个证书对应一个私钥,也就是本地的p12 ...
- TypeScript set get
private _id:number; public get id():number{ return this._id; } public set id(value:number){ this._id ...
- C++17尝鲜:编译期 if 语句
Constexpr If(编译期 if 语句) 以 if constexpr 打头的 if 语句被称为 Constexpr If. Constexpr If 是C++17所引入的新的语法特性.它为C+ ...
- JDBC有哪些接口
1 实现Driver接口的对象是JDBC进行数据库访问的开始,可以通过java.lang.Class类的forName(),动态加载驱动程序. Class.forName("驱动程序&quo ...