错了几年!mysql中把字段设置为空,会不会影响查询效率?

最近一直在忙校招的事情,所以一直没有及时更新文章,今天我们来聊一聊一个经典的问题,Mysql的字段,为什么要尽量设置成非空。



Mysql这条潜规则,很多人都觉得时以讹传讹,三人成虎,实际上,在Mysql官网上,也是对这一项也是有特别的说明,说Mysql中的Null字段,需要额外的设置1个bit进行表示。

很多程序员都认为,这条规则可能会造成mysql的性能降低, 其实不然,我认为真正的原因,应该是这种数据使用起来非常容易挖坑。很多时候,如果sql写得不规范,容易造成数据没有被筛选出来。

我记得几年前,还在一家创业公司的时候,公司发生这样一个案例。有一次交易系统出了故障,造成一些订单的没有赠品的数据错误,这个时候就想从数据库里面捞出数据补偿用户,结果订单状态这种核心字段竟然可以为空,加上操作者又是一个新人写得数据库查询sql不规范,导致很多订单都没有筛选出来,加上微博本已发出补偿公告,造成更大的用户投诉。

那么,这种为空的数据库列,筛选有什么坑呢?



!=不等于查询异常

举个简单的例子,我们有一堆用户的基本数据,男生设置为1,女生设置为2,未知设置为空,当我们使用数据库查询语句,使用不等于的方式查询女生,最后只能够把男生筛选出来,而不能把未知的筛选出来。

最好的方法,就是把位置的默认设置为0。同样,使用not in等sql语法,也有同样的问题。

使用contact的时候异常

我们经常会用数据库存一些用户的收货地址,有时候会使用数据库的contact进行地址的拼接,例如数据库里面存在省份、城市、详细收货地址等字段,如果其中某一个为NULL的话,那么最终拼接出来的结果,也会是NULL。从而达不到预期的效果。

使用count可能有异常

如果我们使用count(字段名),如果这个字段刚好为空的时候,就不会被统计进去。



总结

既然mysql的设置为空这么坑,我们需要怎么应对呢?首先,当我们查询为空的字段是,要使用IS NULL。上述例子,查询非女生的用户,我们就需要指定不等于2或者为空的字段。

不过更重要的是,如果不是特殊需求,我们尽可能的不要设置字段为空,虽然设置为空对性能的影响不大,但是,特别容易挖坑,毕竟程序员是一个团队协作的工作,少一些潜规则,少一些机关,头发会多一些。

举报
评论 0