2014-10-02 79 views
0

我使用MYSQL作爲數據庫。檢查此表是否定義爲MYSQL中的索引列允許Null值爲索引列或NOT NULL?什麼是好的?

CREATE TABLE `test`.`header` 
( 
`header_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, 
`title` VARCHAR(500) NOT NULL, 
`body` VARCHAR(5000) NOT NULL, 
`created_by_id_ref` BIGINT UNSIGNED NOT NULL, 
`created_date` DATETIME NOT NULL, 
`updated_date` DATETIME NULL DEFAULT NULL, 
`is_void` TINYINT(1) NULL DEFAULT NULL, 
PRIMARY KEY (header_id`)) ENGINE=INNODB CHARSET=latin1 COLLATE=latin1_swedish_ci; 

在我的界面中,用戶可以通過從網格視圖中選擇記錄來刪除任何記錄。所以在這種情況下,我只是將「is_void」狀態更新爲true。

我用這個語法聲明瞭這個列。如上所示。再來一次。

`is_void` TINYINT(1) NULL DEFAULT NULL, 

所以如果我添加一個索引到這個列是這個列聲明是好的? 在這種情況下,記錄默認值爲空值。對於無效的記錄它將是「1」。 所以,如果我要過濾任何這些記錄爲無效記錄我不得不使用

Select ........ where is_void=1; 

如果我要過濾非作廢的記錄,我可以使用

Select ........ where is_void IS NULL; 

因此,這是NULL聲明影響我的選擇查詢性能? (請記住我索引此列)

不然我要聲明我列

`is_void` TINYINT(1) NOT NULL, 

,然後我有插入「0」非作廢記錄。那麼如果我想過濾無效的記錄,我可以使用

Select ........ where is_void=0; 

那麼什麼是最好的? 其中is_void = 0;或者is_void IS NULL;

非常感謝。

+0

檢查執行計劃,你會看到。 – 2014-10-02 07:27:58

+0

我會用'1'和'0'來代替'1'和'null'來實現一致性,約定和更容易的開發。在性能方面,我仍然傾向於'1'和'0'。我也不喜歡'null'。 :) – 2014-10-02 08:03:56

+0

Andy你認爲1和0和1和NULL方法在性能上是否相等?或不同? – Sylar 2014-10-02 09:13:03

回答

0

就性能而言,兩種方法都相當於*

就邏輯而言,NULL被廣泛認爲是指「未知值」或「不適用」。去1或0,as defined by the TRUE and FALSE constants

另外,即使MySQL將它作爲TINYINT(1)的別名,我會建議使用ANSI標準BOOLEAN type


*好吧,this is not entirely true在理論上。

+0

謝謝RandomSeed。我將該列聲明爲空以節省存儲空間。因爲我讀了空值將只需要1位來存儲該NULL狀態,其他值需要更多的存儲空間。在我的表中,void不是經常發生的事情。所以我認爲爲每個未記錄的記錄更新0,爲什麼我不應該更新1僅用於無效記錄。你覺得怎麼做? – Sylar 2014-10-02 10:09:15

+0

我認爲1億個布爾值佔用大約100 MB的存儲空間,並且您必須有更好的想法。而且你可能永遠不需要「更新每一個未記錄的記錄」。這很可能是創建列時發生的一次性操作。 – RandomSeed 2014-10-02 10:22:16