简体   繁体   中英

Improve performance when copying records from table to another one

Hi buddies :) I was required to create a php code to handle some workers' data stored in DB. I got the desired result but it takes seconds and seconds (seconds and seconds! >.<) to finish, so I'm afraid I'm not doing something in a right way :(

The workers' data is stored in a mysql table (table1), something like this:

在此输入图像描述

I'm given a pair of dates: initial_date (a) and final_date (b), so my goal is to copy the given workers' data in a new table (table2), day by day from a to b. The expected table should be as shown below (this table will be used later as a basis for further operations, which is not part of the question)

在此输入图像描述

It's a requirement to overwrite any existing data between a and b dates, and 'jump' weekends and holidays.

To get my goal, I'm coding this (let's assume that the connection and all that is done and the checkworkingday function is given):

$initialdate = '2016-10-10';
$finaldate = '2016-10-12';

$x = $initialdate;

do {
    if (checkworkingday($x) == true) {
    $query = mysqli_query($connection,"SELECT name,task FROM table1");
    while($row = mysqli_fetch_array($query)) {
        $task = $row['task'];
        $worker = $row['name'];
        $query2 = mysqli_query($connection,"SELECT task FROM table2 WHERE name = '$worker' AND date = '$x'");
        $row2 = mysqli_fetch_array($query2);
        $existingtask = $row2['task'];
        if (!isset($existingtask)) {
            mysqli_query($connection,"INSERT INTO table2 (date,name,task) VALUES('".$x."','".$worker."','".$task."')");
        } else {
            mysqli_query($connection,"UPDATE table2 SET task = '".$task."' WHERE date = '".$x."' AND worker = '".$name."'");
        }
    }
    }
    $x = date('Y-m-d', strtotime($x . "+1 day"));
} while ($x <= $finaldate);

Just for 3 days as shown in the example, it takes a long to end; and for several weeks or months it takes very, very long (even max execution time is exceeded depending on dates range!).

I'm a newbie and I know the code is quite 'rustic', but I've revised and checked the code and info out there without getting a better performance. What am I doing wrong? Thanks :)

Instead of looping through the enitre data, try INSERT.. SELECT :

INSERT INTO table2 (date,name,task)
SELECT date,name,task 
FROM Table1
WHERE < >;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM