因为把公司 Mysql 一堆带 null 字段优化非空带默认值被骂

2021 年 4 月 15 日
 AhogeK

刚来一家新公司注意到数据库里新建的表有一堆 null 值的字段,想数据量大会影响索引,项目也刚开我就改了下,然后就被训了,就说别动数据库,非不非空让前端去判断(我就想是前端判断啊,但后端不也要校验,数据库只是优化查询)但我没之声 而且好多字段都是中英混用,可难受死我这强迫症了 比如父 id fid 组织类型 orglx 行政区划代码 xzqh 行政区域编码却是 adcode [捂脸.jpg]

12662 次点击
所在节点    问与答
107 条回复
linvon
2021 年 4 月 15 日
快跑
kkkkkrua
2021 年 4 月 15 日
快跑
adjusted
2021 年 4 月 15 日
rails 默认一堆 allow null
thiscat
2021 年 4 月 15 日
s0nnse
2021 年 4 月 15 日
决定不能信任前端的数据,跑,快跑
WilliamYang
2021 年 4 月 15 日
快跑,我说一句腊鸡
dallaslu
2021 年 4 月 15 日
很多很多年前,接触过一个产品,字段名是 a1, a2, a3 ... an 。使用的时候,比如价格字段就是 a200 ;优惠价格 a201 ;商品名 a60……
raaaaaar
2021 年 4 月 15 日
中英配合的一看就不标准啊,可以走了
cjw1115
2021 年 4 月 15 日
“比如父 id fid 组织类型 orglx 行政区划代码 xzqh 行政区域编码却是 adcode”
这尼玛可太优秀了,面向自己编程
jonathanshi
2021 年 4 月 15 日
跑吧
lyoume
2021 年 4 月 15 日
org lx 哈哈哈 秀
timethinker
2021 年 4 月 15 日
NULL 值会影响索引?关于这一点我觉得还是要看场景,如果仅仅只是用空字符串或者 0 来替代 NULL 值,我觉得是没有必要的。也取决于用的什么数据库 /存储引擎。
dyxLike
2021 年 4 月 15 日
null 字段没那么严重吧, 不过这个命名方式确实...
javapythongo
2021 年 4 月 15 日
改数据库之前没有跟 learder 讨论吗?
GGGG430
2021 年 4 月 15 日
@qwe520liao
@dyxLike
大量 null 值相比于空字符值会占用大量空间, 导致 b+树单个叶子节点(页)能存储的方式行数减少,
一方面会增加树高导致 io 次数增加, 也就增加了 mysql 查询耗时;
另一方面会导致 buffer pool 在有限的内存中缓存的行数减少, 降低缓存命中率;
最后, null 对 count 也不友好

当然, 以上是我最近面试需要, 看了一些八股文瞎猜的
timethinker
2021 年 4 月 15 日
@GGGG430
1 、NULL 值并没有比空字符串占用更多的空间,反倒是如果一个列本身用 NULL 是很自然的选择,但是强行给了一个默认值,那么这个默认值反而比 NULL 值所占用的空间更大。
2 、关于索引,如果索引的值本身就很稀疏,那么使用默认值来替代 NULL 并不会有什么帮助( b-tree )。
3 、还是那句话,取决于使用场景和数据库 /存储引擎,如果明确告诉你使用 NULL 就会有问题,那么这个时候才应该考虑是不是要做此类优化,提前优化是万恶之源,而且此类优化效果也是微乎其微的,只是它的不利影响被放大了。

数据库 /存储引擎有很多选择,版本也有很多,很多网上的奇淫技巧只针对于特定的版本有效,没有必要纠结在这些小问题上,国内很多公众号、技术文章现在基本上都是广告居多,颇有点中医理论的味道。
Mac
2021 年 4 月 15 日
我对 NULL 值没这种执念,我觉得 null 挺好的,is null 和 is not null 比 empty 判断要好多了,而且我买的几家国外商业项目,也是把 null 当默认的空值在用,也没什么计较的.
GGGG430
2021 年 4 月 15 日
@qwe520liao
首先 NULL 需要一个额外字节作为判断是否为 NULL 的标志位,
其次您应该没接触过 mysql 规范吧, 有正规 dba 的地方, 建表时都是强制 NOT NULL DEFAULT '' 或 0 的
Dounx
2021 年 4 月 15 日
@adjusted 什么叫默认呢?
wuyazuofeiji
2021 年 4 月 15 日
我觉得你的工作方法有问题,改库这种不是应该先沟通,不管公司烂不烂

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

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

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

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

© 2021 V2EX