インデックス付きテーブルには、最低でも 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 ;