首页 > 解决方案 > SQL插入查询太慢了

问题描述

每 10,000 行插入大约需要 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

标签: mysqlsql

解决方案


我认为这很慢,因为您尝试一次插入批量记录。你有几种方法可以加快这个过程。

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) 在执行查询之前检查您的 PC 可用内存/CPU。尽量释放它


推荐阅读