#Excel技巧# #数据库# #MySQL#
业务背景
不知道您在工作中有没有遇到过这样几种情况:
- 业务定期给你一批数据结构相同的名单或者数据,要求你插入到库里并进行处理。
- 机器学习指标加工时,一个数据库管理系统无法完成所有指标的加工,需要把DBMS1的数据导入到DBMS2中进行进一步加工。
上述两种场景都涉及到数据的批量插入问题,您是怎么做的?笔者在实际工作中经常遇到以上两种情况,经过一段时间摸索后,形成了一套利用Excel的固定的快速插入方法,与君分享。PS:这里不讨论数十万、数百万,甚至数亿条记录的插入,这种必须要用专用ETL和数据同步工具了,工作中遇到的多为大几千条,最多几万条数据的插入。
场景模拟
为了描述Excel在批量数据插入中的应用,我们继续利用《OVER窗口函数,好用的令人惊喜》一文中的场景,即定期批量插入学生的基本信息。
首先,在over_test库中在新建一张表,存储学生的基本信息,即学号和姓名。
create table over_test.student_base ( uid int not null primary key, name varchar(32) not null default 'Unknown' );
学校招生是全年招生,每个月都有一批学生入校,校长每个月都会给你一批学生名单,让你插入到学生基本信息表里进行管理,表样如下:
利用Excel快速生成批量插入语句
假设有100名学生,拿到这个表你会怎么做呢,是一个一个写insert语句吗?现在是100个,要是1000个呢,估计要写到深夜了。那2000、3000、10000呢,OMG!
其实利用Excel很简单,在上面表样后面加一列,列名为SQL,使用Excel的公式即可快速生成插入语句,如下图所示:
SQL列的公式如下:
="insert into over_test.student_base(uid,name) values('"&A2&"','"&B2&"');"
这样只需要在第一行中写好公式,然后双击第一行右下角的十字星,就可以把所有插入语句都生成出来,然后拷到DBMS里面,就可以快速插入了。
然后,把这个Excel表保存下来形成模板,当有新的学生进来时,只要替换A列和B列,SQL列的内容就会自动填充了,这样模板化是不是很方便。
一种更高效的插入方法,你值得拥有
虽说上面的公式模板解决了插入语句批量生成的问题,但执行的时候会发现效率堪忧,区区100行数据的插入竟然需要8.98秒。尽管跟我的测试设备性能和秒表掐表手速有关系,但这个时间对于数据库来说还是太久了。
之所以执行时间会很久,是因为上述模板中使用的公式是数据单条插入,而insert语句执行时会经过开始、认证、打开表、锁表、更新、提交、结束等耗时操作。上述情况下,每执行1条insert,就要进行一次复杂交互流程,100条就是100次,执行时间自然很长。
有一种插入方式是一次执行,全部插入,即使用(Mysql、Hive表中实验有效)
insert into over_test.student_base(uid,name) values
我是会说科技,关注我,一起聊聊数据、科技、安全、金融、IT那些琐事。
然后,在语句下面逐一列出需要插入的数据,这样就可以实现只执行一次复杂的交互便可以将所有数据一次性插入的目的,如下图所示:
知道了语句格式,我们的Excel模板公式应该怎么调整呢?调整如下:
=",('"&A2&"','"&B2&"')"
调整后把语句贴到values后面,记得把第一条的逗号去掉。我们再执行一次,看看执行时间是否会有变化:
这种插入方法下,100条数据只需要0.1898秒,是单条插入的近50倍。1000条记录的执行时间,后者是0.6026秒,前者是1分30秒,前者与后者差了150倍,这说明随着数据条数的增多,单条插入和批量插入的效率差异会越来越大。
总结
本文介绍了一种利用Excel快速生成插入SQL语句的方法,同时对插入效率进行了优化,随算不上高级,但比较实用,适用于结构相同、插入频率按日计、数据量2W以内的数据处理,希望对您有所帮助。
我是会说科技,关注我,一起聊聊数据、科技、安全、金融、IT那些琐事。