“varcharColumn IS NOT NULL”和“tinyintColumn = 1”之间的性能差异?

时间:2011-03-12 06:54:09

标签: mysql database-design

“varcharColumn IS NOT NULL”和“tinyint = 1”之间是否存在很大的性能差异?两列都已编入索引。

我想知道我是否应该:

TINYINT errorFlag
VARCHAR(255) errorMessage

或者如果我可以只用

VARCHAR(255) errorMessage

2 个答案:

答案 0 :(得分:1)

索引为on的列通常会比没有索引的列快,但不会产生显着差异。

换句话说,它完全取决于您正在进行的查询,表中的其他列,查询以及您拥有的索引。

例如,如果errorFlagerrorMessage上没有索引,则它们都会很慢。

另一方面,除非你正在编写一个高吞吐量的大系统系统,或者一个有数百万行的系统,否则你挑选的系统并不重要。

答案 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之类的内容,则上述方法根本不是一个好主意。因为这将要求您始终与错误表进行反连接。