好的,我有大约175k INSERT语句,相当大的INSERT语句,例如:
INSERT INTO `gast` (`ID`,`Identiteitskaartnummer`,`Naam`,`Voornaam`,`Adres`,`Postcode`,`Stad`,`Land`,`Tel`,`Gsm`,`Fax`,`Email`,`Creditcardnummer`) VALUES ('100001','5121-1131-6328-9416','Cameron','Rhoda','Ap #192-1541 Velit Rd.','54398','Catskill','Bermuda','1-321-643-8255','(120) 502-0360','1 48 428 3971-3704','tempor@justo.org','8378-3645-3748-8446');
(无视这是荷兰语的事实)。所有数据都是完全随机的。
我必须这样做3到4次。在我的电脑上查询100k INSERT语句大约需要一个小时。有没有办法在不改变INSERT语句的情况下更快地完成这项工作?我正在使用MySQL Workbench。感谢。
修改
到目前为止,我已尝试过所有建议。仅使用一个INSERT但多个VALUES会给出一个INSERT语句太大的错误。在插入之前禁用索引也不会提高性能。
我也尝试过通过命令行加载一个sql文件,但这也没有做任何事......
每个INSERT的插入性能从0.015秒到0.032秒不等。
答案 0 :(得分:2)
将所有数据插入一个表 - 您要用数据库重新设置数据库的表 - 然后发出INSERT SELECT语句,因为它将以批处理而不是175K不同的语句执行它。
此外,当您使用INSERT SELECT语句重新设置数据库时,请关闭目标表ALTER TABLE yourtablename DISABLE KEYS
上的约束,然后再将其重新打开ALTER TABLE yourtablename ENABLE KEYS
。
我还会在种子数据表上亲自构建covering index,因为这样就不必读取数据页。
答案 1 :(得分:1)
只需使用一个声明
INSERT INTO `gast`
(`ID`,`Identiteitskaartnummer`,`Naam`,`Voornaam`,`Adres`,`Postcode`,`Stad`,`Land`,`Tel`,`Gsm`,`Fax`,`Email`,`Creditcardnummer`)
VALUES
('100001','5121-1131-6328-9416','Cameron','Rhoda','Ap #192-1541 Velit Rd.','54398','Catskill','Bermuda','1-321-643-8255','(120) 502-0360','1 48 428 3971-3704','tempor@justo.org','8378-3645-3748-8446'),
('100002','5121-1131-6328-9416','Cameron','Rhoda','Ap #192-1541 Velit Rd.','54398','Catskill','Bermuda','1-321-643-8255','(120) 502-0360','1 48 428 3971-3704','tempor@justo.org','8378-3645-3748-8446')
等等......
也许你应该做10000次而不是全部175k
答案 2 :(得分:1)
另一种解决方案是将数据保存到文本文件,然后使用LOAD DATA LOCAL INFILE加载数据
它可能不那么好但它会更快
答案 3 :(得分:1)
将所有数据放入csv文件,用户将数据加载FILENAME到表TABLE中 它不会超过一分钟 如果你想用插入来做,最好使用一次发送几行的单个插入