• 数据库类型空间效率探索(三)-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.72946.733 46.73348.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。

  • 相关阅读:
    贪心+stack Codeforces Beta Round #5 C. Longest Regular Bracket Sequence
    暴力/DP Codeforces Beta Round #22 (Div. 2 Only) B. Bargaining Table
    DFS Codeforces Round #299 (Div. 2) B. Tavas and SaDDas
    二分搜索 Codeforces Round #299 (Div. 2) C. Tavas and Karafs
    水题 Codeforces Round #299 (Div. 2) A. Tavas and Nafas
    数学 2015百度之星初赛2 HDOJ 5255 魔法因子
    贪心/数学 2015百度之星资格赛 1004 放盘子
    模拟 2015百度之星资格赛 1003 IP聚合
    rails安装使用版本控制器的原因。
    ActiveStorage. 英文书Learnrails5.2的案例,看如何放到云上。
  • 原文地址:https://www.cnblogs.com/shixm/p/5513028.html
Copyright © 2020-2023  润新知