我的数据库中有一个包含超过 2000 万条记录的表。该表每天平均增加 100,000 条记录。 我需要对该表执行计数,最多只需要扫描 24 小时的记录(平均 100k) 我的一般做法:
- 获取表中的最新 ID(Long maxId =
SELECT MAX(acc.id) FROM MyTable as acc WHERE 1
),因为这非常快。 - 计算间隔:
Long tolerableMin = maxId - 100000
。 - 然后执行第二次
SELECT count(*) FROM MyTable as acc "+ "WHERE acc.X = 'SomeValue' + "AND acc.Y = 'OtherVal' + "AND acc.id > "+ tolerableMin + “按 ID DESC 排序
。
平均执行时间约为 2 秒。
当我使用 where 子句执行直接 count(x) 但在 acc.id > X
上没有条件时,查询挂起超过 15 秒。
我的问题是:
- 这种方法是否最优?
- 我错过了什么吗?有什么提示吗?
注意:我在 Java/Hibernate 后端中使用它,并将 MySQL 作为数据库服务器。
最佳答案
这是一个完全不需要计算的完美场景
我宁愿创建一个触发器来填充一个单独具有计数器的表,如果您不喜欢触发器,请考虑让该表和一个作业在后台不时地填充它。
在现实生活中,真正需要实时数据的情况确实很少,有时 30 分钟到几个小时就可以更新这样的计数器
另一个集思广益的想法是使用 solr 或任何其他 NoSQL,在 nosql 类型的存储中索引所有需要计数的数据,然后计数器会快得多
我没有看到任何更好的方法来在如此大的 SQL 表上使用正常计数来加速它
关于java - 使用 where 子句仅计算大 MySQL 表上的最后 100k 条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61394425/