Самый быстрый способ вставить миллионы строк с приращением в MySQL - PullRequest
1 голос
/ 08 февраля 2012

У меня есть таблица с ОДНОМ bigint-полем.Теперь я хотел бы вставить миллионы строк с приращением, чтобы я придумал следующую процедуру:

CREATE PROCEDURE insertMe()
BEGIN
 DECLARE i BIGINT DEFAULT 1;
 WHILE (i <= 999999999) DO  
   INSERT INTO mytable values(i);  
   SET i=i+1;
 END WHILE;
END;

Конечно, этот зверь занимает слишком много времени, поэтому обычно я делал бы следующее:

INSERT INTO mytable values(1),(2),(3) etc

Но как мне тогда создать строку, и это тоже не займет много времени?

Ответы [ 2 ]

8 голосов
/ 08 февраля 2012

Вы можете использовать поле AUTO_INCREMENT. Если вы попытаетесь вставить NULL в это поле, MySQL сгенерирует для вас автоматический номер, поэтому вам не нужно создавать строку (1), (2), .... Попробуйте это:

CREATE TABLE seed(column1 BIGINT AUTO_INCREMENT PRIMARY KEY) ENGINE=MyISAM;

-- INSERT ONE ROW TO BEGIN WITH
INSERT INTO seed(column1) VALUES(NULL);

-- RUN THIS QUERY 20 TIMES TO GENERATE 1,048,576 ROWS
INSERT INTO seed(column1)
SELECT NULL
FROM seed;

20 итераций вышеуказанных запросов к таблице MyISAM заняли ~ 4,5 секунды.

0 голосов
/ 08 февраля 2012

Запустите его в транзакции, это будет иметь тот же эффект.

CREATE PROCEDURE insertMe()
BEGIN
 DECLARE i BIGINT DEFAULT 1;
 START TRANSACTIOON;
 WHILE (i <= 999999999) DO
   INSERT INTO mytable values(i);  
   SET i=i+1;
 END WHILE;
 COMMIT;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...