暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Mysql_数据类型优化_4

燕山雷震子 2021-12-13
510


关于位数据类型



        Mysql中的位类型都是使用字符串类型存储数据,区别在于底层存储格式和处理方式。

BIT

    Mysql5之前bit是tinyint的另一种叫法,在Mysql5开始bit具备了新的特性。使用bit列可以存储一或多个true/false值,bit(1)意为定义一个包含单个位的字段,bit(2)是存储两个,bit列的最大长度是64个位。

    

    bit列的行为和底层的存储引擎相关,换句话就是不同的存储引擎下对于bit列的处理存在差异,MyISAM会对bitlie进行打包存储,例如对于17个单独的bit列没有null的列,需要17个位存储,MyISAM只会用3个字节来存储这17个bie列,而memory和innodb则为每个bit列使用一个足够存储的最小整数类型来存放,无法做到节省存储空间的效果。


    Mysql将bit按字符串类型处理,当检索bit(1)时结果是一个包含二进制0或1的字符串,而不是ascii的“0”或者“1”。在数字上下文的场景中检索时,结果会是将位字符串转换为数字,下面举例说明:

    1)·create table bitdemo(a bit(8));

    2)·insert into bitdemo values(b'00111001');

    3)·select a, a + 0 from bitdemo;


    在我们开发中,使用orm组件进行字段映射关联,对于查询结果会是字符串9和57,而在数字上下文场景中,得到的将是数字9和57,这里的原因在于mysql的处理之后承接的orm字段类型映射,而非是orm组件的处理。对于bit的这个情况,很多情况下我们在编码时需要先区分使用的场景上下文是字符亦或是数字,这有一些徒增烦恼,这不是解决我们追求的最优解。那么如果我们想在一个bit的存储空间中存储一个true或者false要怎么办才是实惠方便的呢?可以尝试创建一个可为空的char(0)列,该列只占用一个bit存储空间,可以保存的值为null或者长度为零的空字符串"",于此同时char(0)、varchar(0)也作为解决一些老旧程序兼容问题的尝试办法。


 SET

    set列类型存储可以合并多个true/false值,在Mysql的内部是以一系列打包的位的集合表示,即充分利用了存储空间,而且还允许使用Mysql的诸多函数方便查询,如find_in_set()、field()。

    

    set在改变列的定义时代价比较高,需要alter table,在大表中进行类似的操作耗费是不堪地,雷记曾在一个分库分表的scheme里位一张数据量有20w+的表加索引,平均耗时在25min+,25min是什么概念?可以做一道辣椒炒肉,更不要说数据库读写时进行这类alter处理,可见消耗在set列结构调整上青春是白白浪费的,而且在set列上也不支持使用索引。


    对于这两个问题,可以使用一个整数包装一系列的位,如将8个位包装到一个tinyint,且按位操作来使用,然后在应用中为每个位定义名称常量来简化这个操作。相对于set,这样可以不必使用alter table改变字段代表的枚举,但是面临的查询语句也较为难处理难理解,这个处理是否要采用要因人而异,但是set的问题解决了:)



Mysql_数据类型优化
Mysql_数据类型优化_2
Mysql_数据类型优化_3
文章转载自燕山雷震子,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论