我需要一个非常快速的查找表中不在主键中的一行。我有个主意。
我的表只有几百行,一列是布尔值(不是主键),我想运行一个select来查看是否有任何行将该列设置为false。
当我更新一行以将该列设置为false时,我想我还可以设置默认行,因此如果任何行为false,则将默认行设置为false,如果没有行为false,则将默认行设置为true。
然后,当我进行选择时,我只检查默认行。
我想这是一个非常快的选择。有人认为这是一个坏主意,还是有更好的办法。
执行select的线程需要非常快,执行更新的线程不需要这么快,我认为可以处理更新有问题的行和默认行。
最佳答案
通常不建议在布尔列上建立索引。但是,对于这样的查询:
select (case when exists (select 1 from t where not column1) . . .
那么索引可能很有用:
create index idx_t_column1 on t(column1);
您必须测试索引是否实际用于数据库。实际上,我会在索引中添加第二列,只是为了使它更有用,比如为一个
where
子句添加一个column1
和另一列。也就是说,扫描几百行并不是特别慢;因此,即使不使用索引,性能也可能很好。如果要在某个地方设置“默认”值,我认为应该在另一个表中。但是,无论您在哪里设置它,都会有开销——实际上是
insert
s、update
s和delete
s的持续时间的两倍。关于sql - 数据库选择优化,默认行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54483860/