Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL插入查询太慢了_Mysql_Sql - Fatal编程技术网

Mysql SQL插入查询太慢了

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

每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

尝试将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”;这是否允许插入重复值?