0

需要在最短时间在索引表中插入超过 10M 的记录。这 10M 条记录是游标在存储过程中运行的结果。目前,将所有数据插入表中大约需要 50 分钟。

你会推荐什么来加速它的性能?另一种选择是 LOAD DATA INFILE,但您是否会将查询结果导出到临时文件中,以便可以足够快地插入?

由于数据量大,我们考虑将流程解耦并将责任转移给 MySQL,而不是对 PHP 连接器施加额外的压力。这是更好的方法吗?

所有建议都非常受欢迎。谢谢!

光标示例如下:

--- 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