标题: MySQL快速插入大量数据——使用LOAD DATA语句
作者: Demon
链接: https://demon.tw/programming/mysql-load-data-large-data.html
版权: 本博客的所有文章,都遵守“署名-非商业性使用-相同方式共享 2.5 中国大陆”协议条款。
很久很久以前,为了写某个程序,必须在MySQL数据库中插入大量的数据,一共有85766121条。近一亿条的数据,怎么才能快速插入到MySQL里呢?
当时的做法是用INSERT INTO一条一条地插入,Navicat估算需要十几个小时的时间才能完成,就放弃了。最近几天学习了一下MySQL,提高数据插入效率的基本原则如下:
- 批量插入数据的效率比单数据行插入的效率高
- 插入无索引的数据表比插入有索引的数据表快一些
- 较短的SQL语句的数据插入比较长的语句快
这些因素有些看上去是微不足道的,但是如果插入大量的数据,即使很小的影响效率的因素也会形成不同的结果。根据上面讨论的规则,我们可以就如何快速地加载数据得出几个实用的结论。
- 使用LOAD DATA语句要比INSERT语句效率高,因为它批量插入数据行。服务器只需要对一个语句(而不是多个语句)进行语法分析和解释。索引只有在所有数据行处理完之后才需要刷新,而不是每处理一行都刷新。
- 如果你只能使用INSERT语句,那就要使用将多个数据行在一个语句中给出的格式:
INSERT INTO table_name VALUES(...),(...),...
这将会减少你需要的语句总数,最大程度地减少了索引刷新的次数。
根据上面的结论,今天又对相同的数据和数据表进行了测试,发现用LOAD DATA速度快了不只是一点点,竟然只用了十多分钟!所以在MySQL需要快速插入大量数据时,LOAD DATA是你不二的选择。
顺便说一下,在默认情况下,LOAD DATA语句将假设各数据列的值以制表符(\t)分阁,各数据行以换行符(\n)分隔,数据值的排列顺序与各数据列在数据表里的先后顺序一致。但你完全可以用它来读取其他格式的数据文件或者按其他顺序来读取各数据列的值,有关细节请参照MySQL文档。
赞赏微信赞赏支付宝赞赏
随机文章:
D大 又开始研究mysql 了啊
你好,求解答一下问题好吗
贴子在批处理论坛,网址如下,绝对没毒,我经常光顾你网页的。
http://bbs.bathome.net/viewthread.php?tid=16783&extra=