SQL вставка запроса так медленно - PullRequest
1 голос
/ 10 апреля 2019

Каждые 10000 строк занимают около 124 секунд для вставки, как это может быть быстрее

Это таблица, которую я вставляю в

CREATE TABLE `orders` 
(`oid` int(11) NOT NULL AUTO_INCREMENT,
`countryCode` varchar(10) NOT NULL,
`date` datetime NOT NULL,
`id` bigint(20) NOT NULL,
`productId` bigint(20) NOT NULL,
PRIMARY KEY (`oid`),
UNIQUE KEY `id` (`id`),
KEY `date` (`date`),
KEY `productId` (`productId`)
) ENGINE=InnoDB AUTO_INCREMENT=4833010 DEFAULT CHARSET=latin1

это запрос, который я использовал

ALTER TABLE `orders` DISABLE KEYS;
SET FOREIGN_KEY_CHECKS=0;
INSERT IGNORE INTO `orders` (`countryCode`, `date`, `id`,`productId`) 
VALUES 
    ('ru','2019-04-09 06:59',100453324298986,32829863707) ,
    ('fr','2019-04-09 05:59',100645420835625,32829863707) ,
    ('ru','2019-04-08 12:04',704482263524094,32829863707) 
    .......etc 10,000 rows here at once

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

Я думаю, что это медленно, потому что вы пытаетесь сразу вставлять массовые записи. У вас есть несколько способов ускорить процесс.

1) Вставка записей в пакетном режиме. (500-1000 записей одновременно)

2) Увеличение параметров памяти в MYSQL. поэтому память будет увеличена. (http://www.geeksengine.com/database/data-manipulation/bulk-insert.php)

Попробуйте это для пакетного обновления

SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;
SET GLOBAL bulk_insert_buffer_size =1024*1024*512;

START TRANSACTION;  

INSERT IGNORE INTO `orders` (`countryCode`, `date`, `id`,`productId`) 
VALUES 
    ('ru','2019-04-09 06:59',100453324298986,32829863707) ,
    ('fr','2019-04-09 05:59',100645420835625,32829863707) ,
    ('ru','2019-04-08 12:04',704482263524094,32829863707) 
    .......etc 600 rows here at once

COMMIT;

START TRANSACTION;  

INSERT IGNORE INTO `orders` (`countryCode`, `date`, `id`,`productId`) 
VALUES 
    ('ru','2019-04-09 06:59',100453324298986,32829863707) ,
    ('fr','2019-04-09 05:59',100645420835625,32829863707) ,
    ('ru','2019-04-08 12:04',704482263524094,32829863707) 
    .......etc 600 rows here at once

COMMIT;

Примечание:

1) Если это медленно, попробуйте изменить bulk_insert_buffer_size, а количество строк на вставку отсутствует.

2) Проверьте ваш компьютер свободной памяти / ЦП перед выполнением запроса. попытаться освободить его как можно больше

0 голосов
/ 10 апреля 2019

Попробуйте записать оператор вставки как

START TRANSACTION;  
INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('0', 'userid_0', 'content_0', 0);  
INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('1', 'userid_1', 'content_1', 1);  
...  
COMMIT; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...