Mysql更快INSERT

时间:2012-08-03 11:15:57

标签: mysql sql performance insert

好的,我有大约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秒不等。

4 个答案:

答案 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中 它不会超过一分钟 如果你想用插入来做,最好使用一次发送几行的单个插入