使用 PHP 和 mysql 优化将旧数据传输到历史记录表



我目前正在执行清理任务,并希望从 mysql 表中获取数据的历史,结构如下。 最新数据的 ID 为 #5 和 #9。

当前表

ID Employee_ID topic    date_attended
1  7890-1      English  2012-03-24
2  7890-1      English  2013-04-21
3  7890-1      English  2014-02-23
4  7890-1      English  2015-03-22
5  7890-1      English  2016-03-21
6  7890-1      method   2012-04-11
7  7890-1      method   2013-05-02
8  7890-1      method   2014-07-03
9  7890-1      method   2016-09-20

我设法使用以下查询获取最新记录,但这是一个非常大的数据(7000 行(,我花了 30 多秒来执行它并获取每个Employee_ID的结果并添加了一个ini_set所以我不会得到超时错误。

$sql = "    SELECT  *
FROM  `training_database`
WHERE  ID in (
SELECT  MAX(ID)
FROM  `training_database`
WHERE  `employee_id` = '$id'
GROUP BY  topic
)
order by  ID ASC

";

输出

只是一个例子,但我每个employee_ID和主题平均有 12 行

ID Employee_ID topic    date_attended
5  7890-1      english  2016-03-21
9  7890-1      method   2016-09-20 

现在我想获取所有旧记录并使用insert然后将其传输到表中,然后delete查询,但看起来这将是一项很长的任务,我想知道是否有另一种方法可以优化此过程以使其更快"以某种方式",任何建议都会很棒!

假设IDtraining_databasePRIMARY KEY

SELECT  t.*
FROM  
( SELECT  MAX(ID) AS max_id
FROM  `training_database`
WHERE  `employee_id` = '$id'
GROUP BY  topic 
) AS s
JOIN  `training_database` AS t  ON t.ID = s.max_id 

并具有以下复合索引:

INDEX(employee_id, topic, ID)

如果ID不是PK,让我们看看SHOW CREATE TABLE training_databaseEXPLAIN SELECT ...

这是一个"分组最大"问题。 这是一个不能很好地扩展的粗糙解决方案。 更先进的解决方案:http://mysql.rjweb.org/doc.php/groupwise_max

相关内容

  • 没有找到相关文章

最新更新