1

PHP を使用して MySQL テーブルにアクセスし、いくつかのデータを比較しています。スクリプトの実行には 1 時間以上かかります。ソース データで約 10 万行、各ターゲット テーブル (つまり 2 つのテーブル) で約 30 万行を処理しています。

各テーブルの合計列数は 10 以下です。

スクリプトは次のとおりです。

$query = "SELECT bbva_check_deductions.empno, bbva_check_deductions.idr, bbva_check_deductions.current1, bbva_job.paygroup 
            FROM bbva_check_deductions 
            LEFT JOIN bbva_job 
            ON bbva_check_deductions.empno = bbva_job.file_nbr 
            ORDER BY current1 DESC, EmpNo DESC, IDR DESC";
    $result_set = mysql_query($query,$connection);

    while ($result = mysql_fetch_assoc($result_set)) {
        $emplid = compare_filter($result['empno']);
        $oldCode = compare_filter($result['idr']);
        $origCode = $oldCode;
        $payGroup = compare_filter($result['paygroup']);

        $codes = array('DC6', 'HTH', 'DM4', '4UP', 'DC1', 'DC3', 'DC4', 'DEN', 'DCR', 'MDR', 'PRK', 'VIS', '41K');

        //CALCULATE WEEK NO
        if ($payGroup == "J2C") {$week = 24;}
        elseif ($payGroup == "J2E") {$week = 26;}
        else {$week = 22;}

        //QUERY TRANSLATION TABLE FOR TRANSLATED VALUE
        $translate_query = "SELECT * FROM translation WHERE sourceValue = '{$oldCode}' 
        AND sourceField LIKE '%ded_code%' LIMIT 1";
        $translate_result_set = mysql_query($translate_query, $connection); 
        if (mysql_num_rows($translate_result_set) > 0) {
            $translate_result = mysql_fetch_assoc($translate_result_set);
            $oldCode = compare_filter($translate_result['translatedValue']);
        }

        //DETERMINE IF MEMO
        if ($oldCode == "GTL" || $oldCode == "BLI" || $oldCode == "BLT" || $oldCode == "HIC" || $oldCode == "DM4") {
            $queryField = "memo_code"; $queryTable = "pf_check_memo";
        } else {
            $queryField = "deduction_code"; $queryTable = "pf_check_deductions";
        }

        $compare_query = "SELECT {$queryField}, amount_field_for_payroll 
                        FROM {$queryTable} 
                        WHERE empl_id = {$emplid} 
                        AND {$queryField} LIKE '%{$oldCode}%' 
                        AND week_number = {$week} 
                        LIMIT 1";
        $compare_result_set = mysql_query($compare_query, $connection);

        if (mysql_num_rows($compare_result_set) != 0) {
            $compare_result = mysql_fetch_assoc($compare_result_set);
            //PREP COMPARE FIELDS
            $amount = compare_filter($result['current1']);
            $compare_amount = compare_filter($compare_result['amount_field_for_payroll']);

            $negCodes = array('DC6', 'HTH', 'DM4', '4UP', 'DC1', 'DC3', 'DC4', 'DEN', 'DCR', 'MDR', 'PRK', 'VIS', '41K');
            if (in_array($oldCode,$negCodes)) {$compare_amount = $compare_amount * -1;}

            //AMOUNT COMPARE
            direct_compare_basic($amount,$compare_amount,"amount","bbva_check_deductions","Y",$origCode,$oldCode);

        }   else {$content .= $emplid . $separator . "" . $separator . "Emplid + Deduction Code + Pay Group" . $separator . 'bbva_check_deductions' . 
                $separator . field_prep($emplid . " - " . $oldCode . " - " . $payGroup) . $separator . "No Record Found in PF for week {$week}" . $separator . "Y" . $separator . "Y" . 
                $separator . $origCode . $separator . $oldCode . $break;}

次に、.CSV ファイルに書き込むだけです。

私の関数は追加のクエリを呼び出さず、フォーマットするだけです。私は InnoDB テーブルを実行しており、使用されているすべての列のインデックスを持っています。私の PC は WAMP を実行しており、16G の RAM とクアッド コア プロセッサを搭載しています。HDD は 7200 RPM です。

私には時間がかかりすぎているようです。何か案は?

4

0 に答える 0