4

好的,我有大约 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 次。在我的 PC 上查询 100k INSERT 语句大约需要一个小时。有没有办法在不改变 INSERT 语句的情况下更快地做到这一点?我正在使用 MySQL 工作台。谢谢。

编辑

到目前为止,我已经尝试了所有建议。只使用一个 INSERT 但多个 VALUES 会给我一个错误,即 INSERT 语句太大。在插入之前禁用索引也不会提高性能。

我也尝试过通过命令行加载一个 sql 文件,但这也没有做任何事情......

每个 INSERT 的插入性能从 0.015 秒到 0.032 秒不等。

4

4 回答 4

2

将所有数据插入到一个表中 - 您将使用该表重新设置数据库的种子 - 然后发出 INSERT SELECT 语句,因为它将作为批处理而不是 175K 不同的语句执行。

此外,当您使用 INSERT SELECT 语句为数据库重新设定种子时,请关闭目标表上的约束ALTER TABLE yourtablename DISABLE KEYS,然后再将它们重新打开ALTER TABLE yourtablename ENABLE KEYS

我还将亲自在种子数据表上建立一个覆盖索引,因为这样它就不必读取数据页了。

于 2012-08-03T11:21:13.430 回答
1

Just use one statement

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')

etc etc....

Maybe you should do 10000 a time instead of all 175k

于 2012-08-03T11:19:17.040 回答
1

将所有数据放入 csv 文件中,用户将文件 FILENAME 中的数据加载到表 TABLE 不会花费超过一分钟 如果您想使用插入来完成,最好使用单个插入一次发送多行

于 2013-08-21T12:53:57.983 回答
1

另一种解决方案是将数据保存到文本文件中,然后使用 LOAD DATA LOCAL INFILE 加载数据

它可能不那么好,但它会快得多

于 2013-04-23T21:55:35.777 回答