Mysql SQL插入查询太慢了
每10000行插入大约需要124秒,这怎么可能更快呢 这是我插入的表格Mysql SQL插入查询太慢了,mysql,sql,Mysql,Sql,每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 KE
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
尝试将insert语句编写为
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;
尝试将insert语句编写为
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;
我认为这很慢,因为您试图立即插入批量记录。 你有几种方法来加速这个过程 1) 按批插入记录。(一次500-1000条记录) 2) 增加MYSQL中的内存参数。因此,内存将增加。 () 批量更新时尝试此操作
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) 如果速度较慢,请尝试更改批量插入缓冲区大小和每次插入的行数
2) 在执行查询之前,请检查电脑的可用内存/CPU。尽可能多地释放它我认为这很慢,因为您试图立即插入批量记录。 你有几种方法来加速这个过程 1) 按批插入记录。(一次500-1000条记录) 2) 增加MYSQL中的内存参数。因此,内存将增加。 () 批量更新时尝试此操作
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) 如果速度较慢,请尝试更改批量插入缓冲区大小和每次插入的行数
2) 在执行查询之前,请检查电脑的可用内存/CPU。尽量释放它。我建议将数据存储在文件中,并使用
load data infle
@GordonLinoff好主意,但这与INSERT IGNORE
@TimBiegeleisen的行为不同LOAD DATA infle
@Barmar中有一个IGNORE
选项,您应该将此作为答案发布:-)客户端和服务器在同一台机器上吗?如果他们通过网络连接,这可能是瓶颈。我建议将数据存储在文件中,并使用load data infle
@GordonLinoff好主意,但这与INSERT IGNORE
@TimBiegeleisen的行为不同LOAD DATA infle
@Barmar中有一个IGNORE
选项,您应该将此作为答案发布:-)客户端和服务器在同一台机器上吗?如果它们通过网络连接,这可能是瓶颈。这是否会忽略重复项,并且每次插入都使用单个插入行!?进行大量单行插入几乎总是比批量插入慢。它必须从头开始解析每个查询。这是否将忽略重复的查询,并且您将为每个插入使用单个插入行!?进行大量单行插入几乎总是比批量插入慢。它必须从头开始解析每个查询。好的,让我知道。我认为最好的方法是批量插入。您可以关闭自动提交并启动事务,并且每1000条记录提交一次事务。这将加快进程。更糟糕的是,我在每次插入时将查询分成600行,但这需要更多的时间。嗨,我更新了解决方案。请检查一下。来源:1)2)如果这不起作用,请尝试增加Mysql缓存、堆、缓冲区内存变量。一旦我通过增加内存和数据库索引将进程加快100倍,您可以查看我在前面的评论中附加的源代码。这是从官方网站。好的,我会测试这个,但“设置唯一检查=0”;这是否允许插入重复值?好的,让我知道。我认为最好的方法是批量插入。您可以关闭自动提交并启动事务,并且每1000条记录提交一次事务。这将加快进程。更糟糕的是,我在每次插入时将查询分成600行,但这需要更多的时间。嗨,我更新了解决方案。请检查一下。来源:1)2)如果这不起作用,请尝试增加Mysql缓存、堆、缓冲区内存变量。一旦我通过增加内存和数据库索引将进程加快100倍,您可以查看我在前面的评论中附加的源代码。它来自官方网站。好的,我将对此进行测试,但“设置唯一检查=0”;这是否允许插入重复值?