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

2021-04-15 11:08:42 +08:00
 AhogeK

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

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

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

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

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

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

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

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

© 2021 V2EX