“varcharColumn IS NOT NULL”和“tinyint = 1”之间是否存在很大的性能差异?两列都已编入索引。
我想知道我是否应该:
TINYINT errorFlag
VARCHAR(255) errorMessage
或者如果我可以只用
VARCHAR(255) errorMessage
答案 0 :(得分:1)
索引为on的列通常会比没有索引的列快,但不会产生显着差异。
换句话说,它完全取决于您正在进行的查询,表中的其他列,查询以及您拥有的索引。
例如,如果errorFlag
或errorMessage
上没有索引,则它们都会很慢。
另一方面,除非你正在编写一个高吞吐量的大系统系统,或者一个有数百万行的系统,否则你挑选的系统并不重要。
答案 1 :(得分:1)
errorFlag列是100%重复。坚持使用errorMessage。
或者,根据查询模式和数据分布,您还可以考虑创建如下的附加表:
table your_original_table(
original_id
,lots
,of
,other
,columns
,primary key(original_id)
)
table errors(
original_id
,errormessage
,primary key(original_id)
,foreign key(original_id) references your_original_table(original_id)
)
上述方法提供了一种快速获取所有错误的方法,因为errors
中的每一行都是错误。此外,它使您的原始表更小,因此更快。当大多数查询不引用errorMessage列时,请使用此方法,当它们执行时,他们对错误特别感兴趣。
但是,如果您的所有或大部分查询都过滤了非错误,例如where errorMessage is null
之类的内容,则上述方法根本不是一个好主意。因为这将要求您始终与错误表进行反连接。