今天需要将一个含有1000万条数据的文本内容插入到数据库表中,最初自然想到的是使用Insertinto '表名'values(),(),()...这种插入方式,但是发现这种方式对1000万条数据量的情况,明显效率低下,于是选用了直接将文本内容导入数据表的方法:
LOAD DATA LOCAL INFILE "/home/xyw/result.txt" INTO TABLE domainlib_tmp(domain);
这种方式可以将本地的数据文件result.txt直接导入到domainlib_tmp表的domain字段中,这种方式是选择性的导入数据,即只是填充字段domain,如果想填充表中的所有字段,可以使用:
LOAD DATA LOCAL INFILE "/home/xyw/result.txt" INTO TABLE domainlib_tmp FIELDS TERMINATED BY "\t" LINES TERMINATED BY "\n";
TERMINATED BY "\t"表示用\t来分割字段;LINES TERMINATED BY "\n"表示用\n来分割一行。如果您不指定FIELDS子句,则默认值为假设您写下如下语句时的值:
FIELDS TERMINATED BY "\t" ENCLOSED BY "" ESCAPED BY "\\"
如果您不指定LINES子句,则默认值为假设您写下如下语句时的值:
LINES TERMINATED BY "\n" STARTING BY ""
windows和linux的文本终止符不相同(windows使用\r\n;linux使用\n),我在这一块就遇到了问题,我在windows下生成了一个文件,然后在linux下使用,发现填充后的每条记录的结尾都有一个未知字符,导致查询失败,最后我使用的方法是把文本的内容重新复制到linux下新建的文本中,然后导入linux下新建的文本内容就可以解决。
有关Loaddata infile的使用方法自己查阅mysql手册吧。
注意:在导入数据之前一定要把表中的索引删除,否则会特别特别慢。
下面说一下mysql的优化问题。
我发现在使用load data infile时,数据表引擎使用MyISAM比InnoDB快很多!而且数据的查询速度MyISAM也要比InnoDB好,所以我把我的mysql配置文件中默认使用的引擎改成了MyISAM。
有关MyISAM和InnoDB差异的文章,请参考:
MySQLMyISAM和InnoDB对比
mysql的优化需要修改mysql配置文件:my.cnf
Mysql配置原则:
配置合理的MySQL服务器,尽量在应用本身达到一个MySQL最合理的使用
针对 MyISAM或