在我的INNODB mySQL数据库中,我有一些列名为active,Verified,disabled等列名,如name,surname。
更好地解释
Column Type Null Default
expires int(10) Yes NULL
verified tinyint(1) Yes NULL
disabled tinyint(1) Yes NULL
当用户登录我的页面时,我使用PHP并检查例如
if ($row['disabled']) { }
知道他是disabled
( NULL 还是 1 )。 (只有这两种可能性)。
现在,我将它们设置为 NULL ,但我想是否更好地使用 0 ,知道 0 是空的PHP也是。
总结,我的问题是两个。
更新
在我的问题1上,我的问题是 NULL 实际上是null的大小,否则是+3字节对吗?
答案 0 :(得分:5)
在mysql中,NULL值表示特定字段中没有值或者为空。理想情况下,如果你有一个像Name和Address这样的字段,并且不想一直为它们赋值,你可以声明它的默认值是NULL。
但如果你只谈论两种可能性,比如True或False项,那么最好选择空间效率最高的布尔字段。
更进一步,对于像布尔(例如:禁用)和日期(例如:DateJoined)这样的字段,不建议将它们保留为空或未分配。如果你不得不与VB之类的其他语言接口,你可能会遇到问题。例如,如果您尝试通过VB读取指定的日期字段,您将看到您的应用程序崩溃。但是通过PHP,这不是问题。为了安全起见,最好为这些字段分配默认的true或false(1或0)值。
最后,为了检查空值,正常的关系运算符是不合适的。相反,您应该使用 IS NULL 或 IS NOT NULL 运算符。
此处有更多信息:http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html
答案 1 :(得分:4)
成千上万的NULL记录是否在没有原因的情况下增长而不是数千个0记录?
是的,允许列中的NULL
增加数据库的大小,之后虽然存储NULL但不会占用额外的空间。如果列被定义为NOT NULL,则占用的空间更少
varchar()是一个例外,如果你有varchar()列允许NULL,和很多行都是NULL,它可能会占用更少的空间。
我应该改变我检查PHP的方式以获得更好的性能吗?
我怀疑它会有多重要,你不应该用PHP检查1000的记录。
你应该这样做:
SELECT * FROM a WHERE disabled = '1'
或者
SELECT COUNT(*) FROM a WHERE disabled IS NULL
此外,你总能做到
SELECT IFNULL(disabled,0) as disabled FROM ....
不要尝试在PHP中执行DB的工作。
一句警告.....
如果一行有两个值,那么在其上放一个索引可能没有帮助,除非这两个值中的一个很少。
这称为数据库列的低基数
有关详情,请参阅此处:
Does it make sense to use an index that will have a low cardinality?
如果两个值中的一个很少见,请确保测试该值,而不是反过来。
回顾
将表定义为:
Column Type Null? Default Comment
id integer No Auto_inc Primary Key
expires datetime No NULL Must be supplied
verified boolean No 0 boolean = tinyint(1)
disabled boolean No 1 -- but the intend is clearer.
您甚至可以使用BEFORE INSERT TRIGGER
让MySQL自动将expires
字段设置为NOW()+ 30天。
答案 2 :(得分:2)
此问题与性能和数据大小完全无关 默认值应该通过意义而不是数量来选择 就好像你问过,什么燃料对你的车更好 - 汽油或铀。打算与你的车一起使用的燃料!
NULL和0是不同的值,具有不同的含义。
所以,你必须选择一个适合你的逻辑,而不是一些消耗大量空间的无端担忧 - 每100万用户整个1兆字节。