我有两个处于一对多关系的表。假设对于表中的每一行foo
, 表中可以有 0 行或多行bar
引用该行foo
.
客户想知道有多少行bar
引用一行foo
,对于中的所有行foo
.
我可以通过以下查询来完成此操作:
SELECT count(bar_id) FROM bar WHERE bar.foo_id = foo.foo_id;
但是,如果表foo
and bar
很大吗?说foo
有 100 万行,并且bar
有 1000 万行。我们还假设 99% 的行foo
计数将少于 1,000bar
引用它的行。假设客户通常要求大约 100 行foo
一次。
我应该使用带有外键索引的朴素 count() 查询,还是保留一个计数器会更好?甚至可以保留一个柜台吗?通过使用触发器以原子增量和减量更新计数器bar
,我相信这是可能的,但我可能是错的。
也许与直觉相反,您可能会发现简单的count
除非您的工作负载非常偏向于读取,否则该方法速度更快。
这样做的原因是计数器表的作用是序列化更新,因此只有一个事务正在更新给定的foo
可以在任何给定时间飞行。这是因为更新计数器的触发器的更新将锁定该计数器foo
的条目在计数器表中,并且在事务回滚或提交之前不会释放它。
更糟糕的是,如果您的交易影响不止一个foo
另一笔交易也是如此,其中一笔交易很有可能由于死锁而中止。
坚持简单的计数,直到你有充分的理由改变它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)