文档章节

Mysql的列是否应该为null

伯洛芒果汁。
 伯洛芒果汁。
发布于 2017/08/16 11:14
字数 684
阅读 21
收藏 1

本人建表一直不喜欢用NULL值,因为NULL代表给定的列多出了一种特殊的类型值。我一直觉得,int就应该都是int,string就应该都是string。

最近接手了一个项目,表已经都建好了。 但是字段都是nulll,类型除了ID全都是varchar。一直觉得匪夷所思,看了数据来源有点明白了,数据是第三方接口出的,存在大量NULL值。所有字段varchar会把接口给出的错误数据也记录下来。 在此不讨论此做法的利弊。

在某需求中,我体验到了null值所带来的好处,那就是统计。大家都知道,null值不属于任何类型,它就是null。所以他给字段的索引带来了额外的负担。而统计,正好相反。只要你自己明白null不属于任何阵营,在使用的过程中把他和int区分开来,他会带给你很大的方便。 在统计中,Mysql本身会忽略不计入null值,只计算本来应有的类型,只要你明白这点及与你的需求相符,它会给你省去很多的麻烦。

在上述中,我尝试到了null值带来的好处,或者说,我尝试到了一个字段多种类型所带来的好处。

直到我再次遇到了一个麻烦。

SELECT a.id from table is_comment = 0;
SELECT a.id from table is_comment = 1;

上面两段SQL,TABLE有600W的数据,这是今年所产生的,去年的让运维做了归档。is_comment为index。索引大小1.5G。数据3.5G

两个看似相同的SQL,执行起来的速度会让你感觉到绝望。

is_comment为varchar字段。按说所有的数字都会被转换成string去匹配索引。第二条的查询速度不到1秒,但是第一条缺30秒都没跑出来。让我感到相当的绝望。 

EXPLAIN时,两条SQL都不会查询索引。 但是执行时发现is_comment=1是秒查,is_comment=0要30秒。很明显,1是被Mysql做了字符串转换,0却没有。is_comment='1' 或者 is_comment='0'都可以解决这个事情。  但我还是被一个字段多种类型玩的头大。

字段的类型是什么,关乎的不在于你的值,更在于与它交互的代码。这代表你的代码要严格照着给定的类型去执行。而null值,一种特殊的存在,不管你的字段是int还是string,他都是第三种类型。如果你的需求不需要它,就不要用它,尽量保证你的字段只会存在一种类型

© 著作权归作者所有

伯洛芒果汁。
粉丝 11
博文 34
码字总数 36912
作品 0
广州
程序员
私信 提问
MySQL索引类型详解,让MySQL高效运行起来

索引是快速搜索的关键。MySQL索引的建立对于MySQL的高效运行是很重要的。下面介绍几种常见的MySQL索引类型。 在数据库表中,对字段建立索引可以大大提高查询速度。假如我们创建了一个 mytabl...

Junn
2013/07/24
585
0
PHP与MySQL学习笔记9:创建Web数据库

1、在服务器上部署MySQL服务基本步骤合注意点 1)安装MySQL(命令安装、安装包安装等) 2)考虑是否需要一个独立的操作系统用户权限来运行MySQL程序。 3)路径的设置 4)root密码 (附录A:没...

sosly
2016/03/04
16
0
PHP与MySQL学习笔记9:创建Web数据库

1、在服务器上部署MySQL服务基本步骤合注意点 1)安装MySQL(命令安装、安装包安装等) 2)考虑是否需要一个独立的操作系统用户权限来运行MySQL程序。 3)路径的设置 4)root密码 (附录A:没...

slyso
2016/02/24
148
0
MySQL阶段二——sql语句基础(1)

基础学习达到的目标 01.如何使用MySQL数据库 02.如何设计数据库 数据库概述 01.什么是数据库 02.关系型数据库和非关系型数据库 03.常见的数据库 Sql分类 数据库操作 01.创建数据库 02.查看数...

花开半夏qb
2017/07/30
0
0
mysql MYisam 优化

“NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest by......

没人给撸就自己撸码
2014/01/10
47
0

没有更多内容

加载失败,请刷新页面

加载更多

前端技术之:Prisma Demo服务部署过程记录

安装前提条件: 1、已经安装了docker运行环境 2、以下命令执行记录发生在MackBook环境 3、已经安装了PostgreSQL(我使用的是11版本) 4、Node开发运行环境可以正常工作 首先需要通过Node包管...

popgis
今天
5
0
数组和链表

数组 链表 技巧一:掌握链表,想轻松写出正确的链表代码,需要理解指针获引用的含义: 对指针的理解,记住下面的这句话就可以了: 将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指...

code-ortaerc
今天
4
0
栈-链式(c/c++实现)

上次说“栈是在线性表演变而来的,线性表很自由,想往哪里插数据就往哪里插数据,想删哪数据就删哪数据...。但给线性表一些限制呢,就没那么自由了,把线性表的三边封起来就变成了栈,栈只能...

白客C
今天
43
0
Mybatis Plus service

/** * @author beth * @data 2019-10-20 23:34 */@RunWith(SpringRunner.class)@SpringBootTestpublic class ServiceTest { @Autowired private IUserInfoService iUserInfoS......

一个yuanbeth
今天
5
0
php7-internal 7 zval的操作

## 7.7 zval的操作 扩展中经常会用到各种类型的zval,PHP提供了很多宏用于不同类型zval的操作,尽管我们也可以自己操作zval,但这并不是一个好习惯,因为zval有很多其它用途的标识,如果自己...

冻结not
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部