簡體   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