您好,欢迎访问一九零五行业门户网

MySQL数据迁移到MSSQL-以小米数据库为例-测试828W最快可达到2分1_MySQL

这里采用.net framework 4.0以上版本中新出现的 concurrentqueue 类
msdn是这样描述的:
concurrentqueue类是一个线程安全的先进先出 (fifo) 集合。
concurrentqueue的所有公共且受保护的成员都是线程安全的,可从多个线程同时使用。
共采用两个线程,一个读一个写。
concurrentqueue的实现方法:
(fifo) 集合:
concurrentqueue datatablelist = new concurrentqueue();
读:
1 private void mainthread() 2 { 3 if (datatablelist.count 写:
1 private void thread1(object state) 2 { 3 var dt = (datatable)state; 4 mssql.insert(dt); 5 console.writeline(write {0}, datetime.now.tostring(hh:mm:ss.fff)); 6 ok_work_count++;//已处理任务数+1 7 //从任务队列移除 8 if (datatablelist.count > 0) 9 {10 datatablelist.trydequeue(out dt);11 }12 }
读取mysql数据库的方法很简单:
mysqldataadapter.fill(datatable datatable)方法填充数据。
写入mssql数据库的方法也很简单:
sqlbulkcopy.writetoserver(datatable datatable)方法批量插入数据。
经过多次测试,程序上的优化,基本到位了,但我知道肯定还有可以改进的地方,请各路大神不惜赐教。
主要性能瓶颈还是在i/o上,就拿我自己的例子来说吧:
本机上用hhd存放mysql和mssql数据库,不管三七二之一,连同数据迁移程序也放在hhd。
一次读写5000条数据,单线程测试结果是:41分31秒。
本机上创建一个ram disk用来存放mysql和mssql数据库,照旧,数据迁移程序也放在这里。
一次读写20w条数据,单线程测试结果:3分11秒
而改为concurrentqueue多线程同步线程安全后,一次读写20w条数据,多线程测试结果:2分11秒
如果读写数据不需要按顺序的话,完全可以抛弃掉concurrentqueue,从而获得更高的效率,更快的读写速度。
如果sqlbulkcopyoptions不设置为useinternaltransaction (事务),又可以再快上一点点。
如果写入目标是oracle数据库,和mssql相比,oracle的平均写入速度比mssql要快上0.1~0.35秒。
当然,无论怎样,实际测试数据和我公布的测试数据是有差异的,毕竟使用环境不同。
这个测试结果并不专业,请各位多多见谅。
范例源码:https://gitcandy.com/repository/tree/mysqltomssql-multithread-queue-safey
注释:
fifo:“先进先出法”是一种排程算法。它描述了一个伫列所使用的先到先得服务方式:先进入伫列的工作将先被完成,之后进来的则必须稍候。
参见英文版维基百科:http://en.wikipedia.org/wiki/fifo_(computing)
中文版维基百科太简洁了:http://zh.wikipedia.org/zh-cn/先进先出
hhd:全称hard disk drive,详见:硬盘-百度百科
ram disk:详见:ram驱动器-百度百科
其它类似信息

推荐信息