0

インデックス付きテーブルには、最低でも 10M を超えるレコードを挿入する必要があります。これらの 10M レコードは、ストアド プロシージャ内で実行されているカーソルの結果です。現在、すべてのデータをテーブルに挿入するには、約 50 分かかります。

そのパフォーマンスを加速するために何をお勧めしますか? もう 1 つのオプションは LOAD DATA INFILE ですが、ここでもクエリ結果を一時ファイルにエクスポートして、十分な速さで挿入できるようにしますか?

データ量が多いため、PHP コネクタに追加のストレスをかけるのではなく、プロセスを切り離して責任を MySQL に移すことを考えました。それはより良い方法ですか?

すべての推奨事項は大歓迎です。ありがとうございました!

カーソルのサンプルは次のとおりです。

--- MyISAM EXAMPLE
DROP PROCEDURE IF EXISTS createSegmentMyISAM;
DELIMITER //
CREATE PROCEDURE createSegmentMyISAM(IN accountId INT(11), setId INT(11), volume INT(11))
BEGIN
DECLARE complete INT DEFAULT FALSE;

DECLARE field_a VARCHAR(256);
DECLARE field_b VARCHAR(254);
DECLARE field_c VARCHAR(35);
DECLARE field_d VARCHAR(35);

DECLARE cur CURSOR FOR
    SELECT sb.`field_a`,
           sb.`field_b`,
           sb.`field_c`,
           sb.`field_d`
    FROM   `mydb`.`mytable` sb 
    WHERE  sb.`tbl2` IN (SELECT dm.`field_e` 
                           FROM   `mydb`.`tbl3` dm 
                                  INNER JOIN `mydb`.`tbl4` st 
                                          ON dm.`set_id` = st.`set_id` 
                           WHERE  st.set_id = setId) 
    LIMIT  0, volume;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET complete = TRUE; 

OPEN cur;

read_loop: LOOP

    FETCH cur INTO field_a, field_b, field_c, field_d;

    IF complete THEN
        LEAVE read_loop;
    END IF;

    INSERT INTO `mydb`.`temp` (fieldA, fieldB, fieldC, fieldD) VALUES (field_a, field_b, field_c, field_d);

END LOOP;

CLOSE cur;

END //
DELIMITER ;
4

0 に答える 0