【问题标题】:Allow Null values for indexed column or NOT NULL for indexed column in MYSQL? What is good?在 MYSQL 中允许索引列的 Null 值或索引列的 NOT NULL?什么是好的?
【发布时间】:2014-10-02 07:23:33
【问题描述】:

我使用 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 声明会影响我的选择查询性能吗? (记得我索引了这个专栏)

或者我应该将我的专栏声明为

`is_void` TINYINT(1) NOT NULL,

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

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

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

非常感谢。

【问题讨论】:

  • 查看执行计划就知道了。
  • 我会使用1 和0 而不是1 和null 以保持一致性、约定和更容易的开发。性能方面,我仍然倾向于1 和0。我也不喜欢null。 :)
  • Andy 你认为 1 和 0 以及 1 和 NULL 方法在性能方面是否相等?还是不同?

标签: mysql


【解决方案1】:

就性能而言,这两种方法是等效的*。

在逻辑上,NULL 被广泛认为是“未知值”或“不适用”的意思。选择 1 或 0,as defined by the TRUE and FALSE constants。

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


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

【讨论】:

  • 谢谢 RandomSeed。我将该列声明为 null 以节省存储空间。因为我读到空值只需要 1 位来存储 NULL 条件,其他值需要更多存储。在我的表中,void 并不是经常发生的事情。所以我认为,为什么不为每个未取消的记录更新 0,为什么我不应该只为取消的记录更新 1。你怎么看?
  • 我认为 1 亿个布尔值占用大约 100 MB 的存储空间,你一定有更好的事情要考虑。而且您可能永远不必“更新每条未作废的记录”。这很可能是您创建列时会发生的一次性操作。
猜你喜欢
  • 2020-02-14
  • 1970-01-01
  • 2014-03-05
  • 2013-03-12
  • 1970-01-01
  • 2023-04-03
  • 2015-03-16
  • 2015-05-25
  • 1970-01-01
相关资源
最近更新 更多