Mysql大数据量的导入和更新

在工作中有时会遇到有大量需要导入到数据库,如果通过写脚本一条一条的插入到mysql,那么会非常慢的。

之前我有想到一次性插入10000条数据就好了啊,这样确实在大部分情况下都能满足需求了。

但是如果你去多了解一些mysql,会发现其实只需要写一条Sql就可以解决这个问题了,我们就不需要重复制造轮子了。


不过这里需要两个前提,

1、将原始数据转化成为CSV格式的文件

2、mysql客户端连接mysql server时需要加上 --local-infile=1 

(例:mysql -uroot -p -h 127.0.0.1 --local-infile=1,具体原因见: http://dev.mysql.com/doc/refman/5.0/en/load-data-local.html)

3、准备好导入数据的表。(导入的数据会追加到表中,不会覆盖原有的数据)


接下来就是写SQL了

写个例子,具体语法请去mysql官网参考,

 LOAD DATA LOCAL INFILE '/your/file/path'
      INTO TABLE your_table_name
      CHARACTER SET utf8
      FIELDS TERMINATED BY ','
      OPTIONALLY ENCLOSED BY '\"'
      ESCAPED BY '\"'
      LINES TERMINATED BY '\n'
      (@discard_column1 , column2, @discar_column2 , column2 )

@discard_column1,这种前面带有@符号表示变量,在这里也就是这些位置上的数据会被丢弃,不会被导入到数据表中。


上面这种情况只是针对导入新的数据,如果数据中有两部分,a.新的数据和b.已经存在的数据

对于新数据直接插入就好了,对于已经存在的数据,只需要更新其中一些字段,这有什么方法吗?


这时我们可以通过下面的步骤完成(注意,下面所有sql需要写成sql1;sql2;sql3...sqln;的形式,一次性传给mysql,因为使用的是CREATE TEMPORARY TABLE,在执行完以后,这个表会被自动删除,如果你在测试阶段,可以把TEMPORARY先去掉

1、CREATE TEMPORARY TABLE 语法创建临时数据表

2、在临时表中添加字段`to_update` TINYINT(1) NOT NULL DEFAULT 0 ,下面会用到这个字段(这一步可以放到第一步中一起完成) 

2、将所有数据先Load到这张表里

3、使用Update语句,将已经存在的数据进行更新,并set to_update=1。

例:UPDATE 目标数据表  d

JOIN 临时数据表 t ON <判断数据相同的条件>

SET <更新目标数据表d> , t.to_update = 1;

4、剩余的to_update=0的数据需要插入到 目标数据表 中

例:INSERT INTO 目标数据表  d

(d.column1 , d.column2)

SELECT t.column1 , t.column2 FROM  临时数据表 t 

WHERE t.to_update = 0


这样整个过程就结束了,在你有大量数据需要导入到数据库时,他可以帮你节省很多时间,也不会给数据库造成长时间的压力,查询缓存不会被一直刷新。

在你需要这些好处时,能想到这种方式就好了。


感谢我的同事Nash,因为这些是我看到他的代码所学习到的。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值