加速MySQL插入性能?

时间:2013-03-09 23:40:46

标签: php mysql database-performance load-data-infile

需要在索引表中的最短时间插入超过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 ;

0 个答案:

没有答案