我需要在一个表,该表是不是在主键的确实快速查找一行。我有个主意。
我的表将只有几百行,一列将是一个布尔值(不是主键),我想运行一次select以查看是否有任何行将该列设置为false。
当我更新一行以将该列设置为false时,我想我也可以设置一个默认行,因此,如果有任何行为false,则将默认行设置为false,如果没有行具有false,则将默认行设置为true。< / p>
然后,当我选择时,我只检查默认行。
我认为这将是一个非常快的选择。没有人认为这是一个坏主意,或是否有更好的方式来做到这一点。
进行选择的线程必须非常快,而执行更新的线程不必那么快,我认为可以处理有问题的行和默认行的更新。
答案 0 :(得分:1)
如果您经常在非PK列上执行查询,则应在此(这些)列上创建索引,这样可以获得更好的性能。
CREATE INDEX index_name
ON table_name (column1, column2, ...);
您也可以通过执行查询计划来验证这一点,具体取决于您的数据库类型。
答案 1 :(得分:1)
通常不建议在布尔列上使用索引。但是,对于这样的查询:
select (case when exists (select 1 from t where not column1) . . .
那么索引可能会有用:
create index idx_t_column1 on t(column1);
您将必须测试数据库中是否实际使用了索引。我实际上会在索引中添加第二列,只是为了使其更有用,例如,对于具有where
和另一列的column1
子句。
也就是说,扫描几百行并不是特别慢;因此即使不使用索引,性能也可能不错。如果要在某个地方设置“默认”值,我认为它应该在另一个表中。但是,无论您在哪里设置它,都将产生开销-实际上使insert
,update
和delete
s的持续时间加倍。