【发布时间】:2019-12-25 02:46:21
【问题描述】:
我已经阅读了很多关于计数记录性能的答案,例如https://stackoverflow.com/a/1332730/7906257,并且都说没有简单的解决方案。我使用 InnoDB 并且有 CL_GAME 表和 PK 主键。最重要的是我有一个特殊的用例,它绝对可以优化:记录永远不会从表中删除,而只会添加。是否可以说 MySQL 在计算记录时跳过内部验证(如上面链接中所述):
SELECT COUNT(pk) FROM CL_GAME WHERE pk <= 1072370;
有些想法并不完美:
一个明显的技巧是规范化表并消除pk之间的任何间隙。所以 pk 反映了之前的记录数。但这看起来很危险,因为某些还原的事务可能会破坏它(好吧,有一些不平凡的解决方案,例如https://www.percona.com/blog/2011/11/29/avoiding-auto-increment-holes-on-innodb-with-insert-ignore/)
另一个想法是有一个额外的表,其中包含对
其中 count 是 pk pk 来自对 的记录数。因此,可以只计算表的一部分并使用预先计算的值。但我更愿意避免任何额外的结构/缓存,因为实现、验证和支持它们需要时间
【问题讨论】:
标签: mysql performance count