java - 从 MySQL 中超过 100 万条记录创建报告并在 Java JSP 页面中显示

标签 java mysql jsp

我正在开发一个包含 3 个表的 MySQL 数据库——workout_data、exercises 和 set 表。我面临与根据这三个表生成报告相关的问题。

为了添加更多信息,多个练习组成一个练习,多个练习将成为一个锻炼。 我目前拥有要根据这些表中的数据生成报告的指标。我必须生成过去 42 天(包括本周)的报告。当我通过连接这些表获得报告时,查询会运行很长时间。

例如 - 仅过去 42 天,sets 表就有超过 100 万条记录。该表中的id是exercise表中的excercise_id。 excercise表的id是workout_data表中的workout_id。

我正在运行此查询,需要 10 多分钟才能获取数据。我必须准备一份报告并将其在浏览器中显示给用户。但由于此长时间运行的查询,网页超时,用户无法查看报告。

关于如何实现这一目标有什么建议吗?

        SELECT REPORTSETS.USER_ID,REPORTSETS.WORKOUT_LOG_ID,
               REPORTSETS.SET_DATE,REPORTSETS.EXCERCISE_ID,REPORTSETS.SET_NUMBER 
          FROM EXCERCISES 
    INNER JOIN REPORTSETS ON EXCERCISES.ID=REPORTSETS.EXCERCISE_ID 
         where user_id=(select id from users where email='testuser1@gmail.com') 
           and substr(set_date,1,10)='2013-10-29' 
      GROUP BY REPORTSETS.USER_ID,REPORTSETS.WORKOUT_LOG_ID,
               REPORTSETS.SET_DATE,REPORTSETS.EXCERCISE_ID,REPORTSETS.SET_NUMBER

最佳答案

有两件事:

首先,您可以使用以下 WHERE 子句项来提取一天的数据。

  AND substr(set_date,1,10)='2013-10-29'

这绝对无法在日期上使用索引。如果您的 set_date 列具有 DATETIME 数据类型,那么您想要的是

  AND set_date >= `2013-10-09`
  AND set date <  `2013-10-09` + INTERVAL 1 DAY

这将允许对 set_date 上的索引使用范围扫描。在我看来,您可能需要在 (user_id, set_date) 上建立复合索引。但你应该仔细研究一下 EXPLAIN 来弄清楚这是否正确。

其次,您滥用了GROUP BY。除非查询中具有某种汇总函数,例如 SUM()GROUP_CONCAT(),否则该子句毫无意义。您想要ORDER BY吗?

关于java - 从 MySQL 中超过 100 万条记录创建报告并在 Java JSP 页面中显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19727735/

相关文章:

Java实现跳跃列表中的删除方法

java - 将用户角色添加到 Spring MVC 测试框架中的请求

php - MYSQL 5.5 到 MARIADB 10.0 = 非分组字段 'x' 用于 HAVING 子句

Java Spring : OAuth authentication failed: Unknown Error

java - 如何限制(队列)针对给定数据库执行的线程数量(每个并发测试的单独数据)?

mysql - 在 INSERT 之前触发删除

javascript - 所有 INCLUDE 的组合 WHERE 子句

java - 如何使用 Struts 2 在同一行中放置多个文本字段而不使用主题 ="simple"?

java - JSP无法显示俄语字符

jsp - 将异常从 servlet 转发到 jsp 页面的好方法是什么?