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

时间:2014-10-02 07:23:34

标签: mysql

我使用MYSQL作为数据库。检查是此表定义

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声明对我的select查询性能有影响吗? (记住我已将此列编入索引)

或者我要将我的专栏声明为

`is_void` TINYINT(1) NOT NULL,

然后我为非空白记录插入“0”。然后,如果我想过滤无效的记录,我可以使用

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

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

非常感谢。

1 个答案:

答案 0 :(得分:0)

就性能而言,两种方法都是等同的 *

在逻辑方面,NULL被广泛认为是意义"未知价值"或"不适用"。使用1或0,as defined by the TRUE and FALSE constants

此外,即使MySQL将其作为TINYINT(1)的别名实现,我建议使用ANSI标准BOOLEAN type


* 好的,理论上this is not entirely true