繁体   English   中英

我应该选择什么来获得更好的脚本性能和数据库大小,NULL或0?

[英]What should I choose for better script performance and database size, NULL or 0?

在我的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']) { }

知道他是否被disabledNULL1 )。 (只有这两种可能性)。

现在,我将它们设置为NULL,但我认为如果使用0代替它更好,因为知道PHP中的0也是空的。

最后,我的问题是两个。

  1. 成千上万的NULL记录是否增长而没有DB而不是数千条0记录的原因?
  2. NULL0是否会以不同的方式影响PHP执行的性能? 如果是这样,mySQL和PHP的最佳组合是什么,如上所述的请求检查?

更新

在我的问题1,我的问题是如果NULL实际上是null的大小,否则是+3字节对吗?

在mysql中,NULL值表示特定字段中没有值或者为空。 理想情况下,如果您有一个名称和地址等字段,并且不想一直为它们赋值,则可以声明它的默认值为NULL。

但是如果你只谈论两种可能性,比如True或False项,那么最好选择空间效率最高的布尔字段。

更进一步,对于像布尔(例如:禁用)和日期(例如:DateJoined)这样的字段,不建议将它们保留为空或未分配。 如果你不得不与VB之类的其他语言接口,你可能会遇到问题。 例如,如果您尝试通过VB读取指定的日期字段,您将看到您的应用程序崩溃。 但是通过PHP,这不是问题。 为了安全起见,最好为这些字段分配默认的true或false(1或0)值。

最后,要检查空值,正常的关系运算符是不合适的。 相反,您应该使用IS NULLIS NOT NULL运算符。

更多信息: http//dev.mysql.com/doc/refman/5.0/en/working-with-null.html

成千上万的NULL记录是否增长而没有DB而不是数千条0记录的原因?

是的,允许列中的NULL会增加数据库的大小,之后存储NULL不会占用额外的空间。 如果列定义为NOT NULL,则占用的空间更少。
varchar()是一个例外,如果你有允许NULL的varchar()列, 并且许多行是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的工作。

一句警告.....

如果一行有两个值,那么在它上面放一个索引可能没有用,除非这两个值中的一个很少见。
这称为数据库列的低基数。
有关详细信息,请参阅此处: 使用具有低基数的索引是否有意义?

如果这两个值中的一个很少,请确保测试该值,而不是相反。

回顾一下
将表定义为:

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天。

这个问题与性能和数据大小完全无关
应根据意义而不是数量来选择默认值。
就好像你问过,什么燃料对你的车更好 - 汽油或铀。 打算与你的车一起使用的燃料!

NULL和0是不同的值,具有不同的含义。

  • NULL表示没有值。 会影响一些查询,例如where子句。
  • 0表示完全有效的值,等于0

所以,你必须选择一个适合你的逻辑 ,而不是一些消耗大量空间的无端担忧 - 每100万用户整个1兆字节。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM