需要在索引表中的最短时间插入超过10M条记录。这些10M记录是游标在存储过程中运行的结果。目前,将所有数据插入表格大约需要50分钟。
您建议加快其性能?另一个选项是LOAD DATA INFILE,但是你再次将查询结果导出到一个临时文件中,这样可以足够快地插入吗?
由于数据量庞大,我们考虑将流程解耦并将责任转移到MySQL,而不是给PHP Connector带来额外的压力。这是一种更好的方法吗?
所有建议都非常受欢迎。谢谢!
光标的示例如下:
--- 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 ;