[英]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']) { }
知道他是否被disabled
( NULL或1 )。 (只有這兩種可能性)。
現在,我將它們設置為NULL,但我認為如果使用0代替它更好,因為知道PHP中的0也是空的。
最后,我的問題是兩個。
更新
在我的問題1,我的問題是如果NULL實際上是null的大小,否則是+3字節對嗎?
在mysql中,NULL值表示特定字段中沒有值或者為空。 理想情況下,如果您有一個名稱和地址等字段,並且不想一直為它們賦值,則可以聲明它的默認值為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
成千上萬的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是不同的值,具有不同的含義。
所以,你必須選擇一個適合你的邏輯 ,而不是一些消耗大量空間的無端擔憂 - 每100萬用戶整個1兆字節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.