K、 0行受影响(27.25秒) mysql>调用inputRowsNoRandom1(1000000000); 查询正常,0行受影响(26.76秒) mysql>调用inputRowsNoRandom1(100000000000); 查询正常,0行受影响(26.43秒)

K、 0行受影响(27.25秒) mysql>调用inputRowsNoRandom1(1000000000); 查询正常,0行受影响(26.76秒) mysql>调用inputRowsNoRandom1(100000000000); 查询正常,0行受影响(26.43秒),mysql,database,multithreading,stored-procedures,concat,Mysql,Database,Multithreading,Stored Procedures,Concat,您自己也看到了差异。仍然比交叉连接差3倍。我的任务和你的一样。上面的答案很好地解释了这件事。我想谈谈我的解决办法。 在我的任务中,我有一个问题。首先,我生成随机数据,然后排队查询,然后从那里排队并写入数据库。在begin中,写入242M数据行花费了70个小时。然后我换了引擎。MyISAM比InnoDB更优秀。从那以后,写作时间变成了30个小时。还是太多了。。。所以我必须改变smt 而不是执行“插入……值(1,2,3)” 我做了“插入…值(1,2,3), (4,5,6), (7,8,9) 它工作得

您自己也看到了差异。仍然比交叉连接差3倍。

我的任务和你的一样。上面的答案很好地解释了这件事。我想谈谈我的解决办法。 在我的任务中,我有一个问题。首先,我生成随机数据,然后排队查询,然后从那里排队并写入数据库。在begin中,写入242M数据行花费了70个小时。然后我换了引擎。MyISAM比InnoDB更优秀。从那以后,写作时间变成了30个小时。还是太多了。。。所以我必须改变smt

而不是执行“插入……值(1,2,3)”

我做了“插入…值(1,2,3), (4,5,6), (7,8,9)

它工作得非常快。我的观点是把它们切成小块,像批量数据一样写入数据库


编辑:我写这些是因为我遇到了很多麻烦,然后我想出来了,现在我想和大家分享。哈哈

评论!为什么以Cthulhu的名义使用DBMS循环时间竖梃来连接字符串。我很惊讶它的速度如此之快,你在这里检查礼物马的牙齿。这可能是我在这里遇到的信息最丰富的问题,bravoHi Tony Hopkinson,我试图在这里提供帮助,试图用大量随机数据快速填充表格,以检查性能,并用数百万数据进行一些测试,当我发现这个问题时。非常好的peterm,非常感谢,我将仔细查看代码并将标题更改为MySQL:高效地填充存储过程中的表。本主题还添加了相关信息:测试了第一个方法(使用selects的最快方法)并插入了1亿行。它花了16分37秒才完成。我将用同样的方法测试插入随机数据,可能需要更多的时间。
DELIMITER $$
USE `test`$$

DROP PROCEDURE IF EXISTS `inputRowsNoRandom`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `inputRowsNoRandom`(IN NumRows BIGINT)
BEGIN
    /* BUILD INSERT SENTENCE WITH A LOS OF ROWS TO INSERT */
    DECLARE i BIGINT;
    DECLARE nMax BIGINT;
    DECLARE squery LONGTEXT;
    DECLARE svalues LONGTEXT;

    SET i = 1;
    SET nMax = NumRows + 1;
    SET squery = 'INSERT INTO `entity_versionable` (fk_entity, str1, str2, bool1, double1, DATE) VALUES ';
    SET svalues = '("1", "a1", 100, 1, 500000, "2013-06-14 12:40:45"),';

    WHILE i < nMax DO
        SET squery = CONCAT(squery, svalues);
        SET i = i + 1;
    END WHILE;

    /*SELECT squery;*/
    SET squery = LEFT(squery, CHAR_LENGTH(squery) - 1);
    SET squery = CONCAT(squery, ";");
    SELECT squery;

    /* EXECUTE INSERT SENTENCE */
    /*START TRANSACTION;*/
    /*PREPARE stmt FROM squery;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    */

    /*COMMIT;*/
END$$
DELIMITER ;
INSERT INTO `entity_versionable` (fk_entity, str1, str2, bool1, double1, date)
SELECT 1, 'a1', 100, 1, 500000, '2013-06-14 12:40:45'
  FROM
(
select a.N + b.N * 10 + c.N * 100 + d.N * 1000 + e.N * 10000 + f.N * 100000 + 1 N
from (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) a
      , (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) b
      , (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) c
      , (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) d
      , (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) e
      , (select 0 as N union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) f
) t
Query OK, 1000000 rows affected (7.63 sec) Records: 1000000 Duplicates: 0 Warnings: 0
DELIMITER $$
CREATE PROCEDURE `inputRowsNoRandom`(IN NumRows INT)
BEGIN
    DECLARE i INT DEFAULT 0;

    PREPARE stmt 
       FROM 'INSERT INTO `entity_versionable` (fk_entity, str1, str2, bool1, double1, date)
             VALUES(?, ?, ?, ?, ?, ?)';
    SET @v1 = 1, @v2 = 'a1', @v3 = 100, @v4 = 1, @v5 = 500000, @v6 = '2013-06-14 12:40:45';

    WHILE i < NumRows DO
        EXECUTE stmt USING @v1, @v2, @v3, @v4, @v5, @v6;
        SET i = i + 1;
    END WHILE;

    DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;
mysql> CALL inputRowsNoRandom(1000000); Query OK, 0 rows affected (2 min 51.57 sec)
DELIMITER $$
CREATE PROCEDURE inputRowsNoRandom1(IN NumRows BIGINT, IN BatchSize INT)
BEGIN
    DECLARE i INT DEFAULT 0;

    PREPARE stmt 
       FROM 'INSERT INTO `entity_versionable` (fk_entity, str1, str2, bool1, double1, date)
             VALUES(?, ?, ?, ?, ?, ?)';
    SET @v1 = 1, @v2 = 'a1', @v3 = 100, @v4 = 1, @v5 = 500000, @v6 = '2013-06-14 12:40:45';

    START TRANSACTION;
    WHILE i < NumRows DO
        EXECUTE stmt USING @v1, @v2, @v3, @v4, @v5, @v6;
        SET i = i + 1;
        IF i % BatchSize = 0 THEN 
            COMMIT;
            START TRANSACTION;
        END IF;
    END WHILE;
    COMMIT;
    DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;
mysql> CALL inputRowsNoRandom1(1000000,1000); Query OK, 0 rows affected (27.25 sec) mysql> CALL inputRowsNoRandom1(1000000,10000); Query OK, 0 rows affected (26.76 sec) mysql> CALL inputRowsNoRandom1(1000000,100000); Query OK, 0 rows affected (26.43 sec)