为MYSQL中的索引列允许Null值为索引列或NOT NULL?什么是好的?

问题描述:

我使用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

就性能而言,两种方法都相当于*

就逻辑而言,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