我有两个一对多的关系表.假设对于表中的每一行,表foo中可以有0行或更多行bar引用该行foo.
对于所有行,客户端想要知道bar引用行foo的行数foo.
我可以使用以下查询完成此操作:
SELECT count(bar_id) FROM bar WHERE bar.foo_id = foo.foo_id;
Run Code Online (Sandbox Code Playgroud)
但是,如果表foo和bar很大?说foo有100万行,并bar有1000万行.我们还要说99%的行foo会bar引用少于1,000 行的计数.假设客户端通常一次要求大约100行foo.
我应该使用带有外键索引的naive count()查询,还是更好地保留一个计数器?甚至可以保留一个柜台?通过使用触发器更新计数器的原子增量和减量bar,我相信它是可能的,但我可能是错的.
也许与直觉相反,您可能会发现count除非您的工作量非常偏向读取,否则简单的方法会更快.
这样做的原因是计数器表的效果将是序列化更新,因此foo在任何给定时间只有一个更新给定的事务可以在飞行中.这是因为更新计数器的触发器的更新将锁定foo计数器表中的条目,并且在事务回滚或提交之前不会释放它.
更糟糕的是,如果您的事务影响多个,foo而另一个影响影响多,那么由于死锁,其中一个事务很可能会中止.
坚持一个简单的计数,直到你有充分的理由改变它.
| 归档时间: |
|
| 查看次数: |
1339 次 |
| 最近记录: |