mysql 字段设置讨论

2020-03-26 18:02:28 +08:00
 brader

一直对 mysql 的一些字段设置存在疑虑,在这儿提出来希望各位大神指点! mysql 字段设置为 无符号 、not null 等等,有没有节省存储空间的作用?有没有提高性能的作用?是否只是单纯的起到约束作用?

对于一些字段,比如 status,我知道,它只有 0 和 1,我经常使用 tinyint 类型,长度 4, 我是否更应该设置它的长度为 1 ?这样是否更高效呢?

2734 次点击
所在节点    MySQL
5 条回复
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 同理
brader
2020-03-26 18:35:04 +08:00
@liuxu 我尝试创建了不同长度的 int,从表面看起来,他们没有任何区别,长度 1 的,实际上也能存储 1111111111 这样的数字,那么对于 int 来说长度约束,是不是没有作用的呢?
joyme
2020-03-26 19:00:55 +08:00
@brader int(1) 中的 1 不是用来设置长度的,只是 mysql 给你看的时候显示前 1 位而已,
Sikoay
2020-03-26 22:56:39 +08:00
status 设置为 char(0), 如果为 true 写入时写 '' , false 时写 null 。
应该没有比这个更省的了吧(书上看到的
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 上。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/656470

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX