java - 使用 where 子句仅计算大 MySQL 表上的最后 100k 条记录

标签 java mysql performance hibernate

我的数据库中有一个包含超过 2000 万条记录的表。该表每天平均增加 100,000 条记录。 我需要对该表执行计数,最多只需要扫描 24 小时的记录(平均 100k) 我的一般做法:

  1. 获取表中的最新 ID(Long maxId = SELECT MAX(acc.id) FROM MyTable as acc WHERE 1),因为这非常快。
  2. 计算间隔:Long tolerableMin = maxId - 100000
  3. 然后执行第二次 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 秒。 我的问题是:

  1. 这种方法是否最优?
  2. 我错过了什么吗?有什么提示吗?

注意:我在 Java/Hibernate 后端中使用它,并将 MySQL 作为数据库服务器。

最佳答案

这是一个完全不需要计算的完美场景

我宁愿创建一个触发器来填充一个单独具有计数器的表,如果您不喜欢触发器,请考虑让该表和一个作业在后台不时地填充它。

在现实生活中,真正需要实时数据的情况确实很少,有时 30 分钟到几个小时就可以更新这样的计数器

另一个集思广益的想法是使用 solr 或任何其他 NoSQL,在 nosql 类型的存储中索引所有需要计数的数据,然后计数器会快得多
我没有看到任何更好的方法来在如此大的 SQL 表上使用正常计数来加速它

关于java - 使用 where 子句仅计算大 MySQL 表上的最后 100k 条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61394425/

相关文章:

java - 如何禁用触摸事件?

java - 在 Spring @Bean 方法中返回接口(interface)的限制

MySQL批量插入

java - 正则表达式性能 java vs c++11

swift - 强制展开可选的优点是什么?

java - 将可为空的 java boolean 值转换为 scala boolean 值时出错

Java-Groovy : regex parse text block

mysql - 升级后Mariadb指向旧版本

mysql - mysql 中的触发器插入多行而不是一行

mysql - SQL连接不完整的表