mysql - 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
解决方案
我认为这很慢,因为您尝试一次插入批量记录。你有几种方法可以加快这个过程。
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。尽量释放它
推荐阅读
- emacs - Mac M1 中的 Emacs Mx 绑定
- python - CNN 数据输入错误?
- apache - httpd 重启失败:NameVirtualHost 错误
- android - Android 生物识别单元测试
- sharepoint-online - 触发电源自动复制共享点页面和前缀页面名称
- mysql - 在 mysql 中,DATE_ADD() 和简单的 +/- INVERVAL 不同吗?
- networking - 如何使用 Ansible 变量在 Ubuntu 和 CentOS 上配置网络接口?
- python - 如何循环使用参数排列的函数?
- ldap - ldapsearch - 仅当值具有两个属性时才返回
- c# - Visual Studio 无效规则枚举成员“NewProducts”与成员“NewProducts”具有相同的常量值“6”