一直对 mysql 的一些字段设置存在疑虑,在这儿提出来希望各位大神指点! mysql 字段设置为 无符号 、not null 等等,有没有节省存储空间的作用?有没有提高性能的作用?是否只是单纯的起到约束作用?
对于一些字段,比如 status,我知道,它只有 0 和 1,我经常使用 tinyint 类型,长度 4, 我是否更应该设置它的长度为 1 ?这样是否更高效呢?
1
liuxu 2020-03-26 18:20:10 +08:00
无符号可以增大数据集合,业务上不需要负数的话,-100 到 100 和 0 到 200,前者肯定多余
not null 方面,Innodb 的 null 是需要单独处理的,会导致索引增大(看的书是这么说的,基于 mysql5,没有源码验证,mysql8 的情况不清楚) int(1)和 int(11)都是 4 字节存储,只是显示的时候前者显示 1 位数字,后者显示 11 位数字,不会更高效,tinyint 同理 |
2
brader OP @liuxu 我尝试创建了不同长度的 int,从表面看起来,他们没有任何区别,长度 1 的,实际上也能存储 1111111111 这样的数字,那么对于 int 来说长度约束,是不是没有作用的呢?
|
4
Sikoay 2020-03-26 22:56:39 +08:00 1
status 设置为 char(0), 如果为 true 写入时写 '' , false 时写 null 。
应该没有比这个更省的了吧(书上看到的 |
5
zpf124 2020-03-27 11:50:58 +08:00
无符号数和有符号的区间大小是一致的,只是区间范围不一致如, 0~256, -127~128, 如果你这列用不到负数自然用无符号就可以存更多内容。 对性能没啥影响。
整数类型在数据库里设置长度都不会影响到它实际的存储长度。 不过对于实际情况还要看你的代码,以及使用的类库。 我用 java,Mybatis 这种半 ORM 的框架,会写实体类与表对应, 因为 java 没有无符号数字类型一说,这时候在数据库设置无符号反倒是累赘,会产生各种 bug 。 比如默认的自动生成实体类的工具是 byte 对应 tinyint, 而如果设置了无符号,我数据库可以存 200 这个数,而 ORM 查询数据后自动封装生成 bean 的过程就会报 这个值超出了 128 的错误。 再来 还有个属于这个 ORM 自己的特性,如果字段类型设置为 tinyint(1), 则根据表自动生成实体类的工具会把这个字段对应到 boolean 上。 |