MySQL数据迁移到MSSQL-以小米数据库为例-测试828W最快可达到2分11秒
这里采用.NET Framework 4.0以上版本中新出现的 ConcurrentQueue<T> 类
MSDN是这样描述的:
ConcurrentQueue<T> 类是一个线程安全的先进先出 (FIFO) 集合。
ConcurrentQueue<T> 的所有公共且受保护的成员都是线程安全的,可从多个线程同时使用。
共采用两个线程,一个读一个写。
ConcurrentQueue<T>的实现方法:
(FIFO) 集合:
ConcurrentQueue<DataTable> DataTableList = new ConcurrentQueue<DataTable>();
读:
private void MainThread()
{
if (DataTableList.Count < _pageCount)//小于队列最大值后即可再次获取一次
{
for (int index = ; index < _pageCount; index++)
{
DataTable dt = null;
try
{
int counts = index == ? index : (index * PageSize - );
dt = MySql.GetDataTable(counts, PageSize);
DataTableList.Enqueue(dt);
Console.WriteLine("Read {0}\t{1}/{2}", DateTime.Now.ToString("HH:mm:ss.fff"), index, counts);
}
catch (Exception)
{ }
ThreadPool.QueueUserWorkItem(Thread1, dt);
}
}
}
写:
private void Thread1(object state)
{
var dt = (DataTable)state;
MsSql.Insert(dt);
Console.WriteLine("Write {0}", DateTime.Now.ToString("HH:mm:ss.fff"));
OK_WORK_COUNT++;//已处理任务数+1
//从任务队列移除
if (DataTableList.Count > )
{
DataTableList.TryDequeue(out dt);
}
}
读取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<T>多线程同步线程安全后,一次读写20W条数据,多线程测试结果:2分11秒
如果读写数据不需要按顺序的话,完全可以抛弃掉ConcurrentQueue<T>,从而获得更高的效率,更快的读写速度。
如果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驱动器-百度百科
MySQL数据迁移到MSSQL-以小米数据库为例-测试828W最快可达到2分11秒的更多相关文章
- MySQL数据迁移那些事儿
前言: 在平时工作中,经常会遇到数据迁移的需求,比如要迁移某个表.某个库或某个实例.根据不同的需求可能要采取不同的迁移方案,数据迁移过程中也可能会遇到各种大小问题.本篇文章,我们一起来看下 MySQL ...
- mssql与mysql 数据迁移
概要: mssql向mysql迁移的实例,所要用到的工具bcp和load data local infile. 由于订单记录的数据是存放在mssql服务器上的,而项目需求把数据迁移到mysql ser ...
- MySQL数据迁移到SQL Server
数据迁移的工具有很多,基本SSMA团队已经考虑到其他数据库到SQL Server迁移的需求了,所以已经开发了相关的迁移工具来支持. 此博客主要介绍MySQL到SQL Server数据迁移的工具:SQL ...
- MySQL数据转移至MSSQL详解
一.安装MySQL ODBC驱动 为MySQL安装Connector/ODBC驱动.在此需要注意的一点是Connector/ODBC驱动与MySQL Server的版本对应问题. 二.创建系统DS ...
- centos下mysql数据迁移方法
第一种: 原始数据库不需要重新安装: 默认mysql会安装在/var/lib/mysql这里,若将数据迁移到/data/mysql目录下,步骤如下: 1.停止mysql服务 2.#cp /var/li ...
- MySQL数据迁移问题
最近尝试了一下小型数据迁移.本地迁移,windows平台,修改配置文件中的data_dir项,然后将旧的data文件下的数据文件全部拷贝过去. 之后登陆数据库,竟然1145错误.可以看到数据库的结构, ...
- Mysql 数据迁移后 启动出错
今天上班后不知道为什么,mysql一直无法启动,折腾了半天于是决定重装 我本地的server用的是wamp , 重装的时候, 要进行数据备份 , 我使用的最简单粗暴的备份方式, 就是直接进入到mysq ...
- .Net5 IdentityServer4下SqlServer和Mysql数据迁移
1.概念 以下概念从官网整理的,我也是看官网一步一步学习的 官网地址 https://identityserver4.readthedocs.io/en/latest/index.html 1.1 I ...
- 记一次MySQL数据迁移到SQLServer全过程
为什么要做迁移? 由于系统版本.数据库的升级,导致测试流程阻塞,为了保证数据及系统版本的一致性,我又迫切需要想用这套环境做性能测试,所以和领导.开发请示,得到批准后,便有了这次学习的机会,所以特此来记 ...
随机推荐
- HDFS 与 GFS 的设计差异
后端分布式系列」前面关于 HDFS 的一些文章介绍了它的整体架构和一些关键部件的设计实现要点. 我们知道 HDFS 最早是根据 GFS(Google File System)的论文概念模型来设计实现的 ...
- Web打印组件jatoolsPrinter
应用web化,不论对开发商,还是对用户来说,实在是一种很经济的选择,因为基于web的应用,客户端的规则很简单,容易学习,容易维护,容易发布.但对程序员来说,因为浏览器的局限性,却要面对很多挑战.怎么样 ...
- ABP理论学习之SignalR集成
返回总目录 本篇目录 介绍 安装 建立连接 内置功能 你自己的SignaR代码 介绍 Abp.Web.SignalR 使得在基于ABP的应用程序中使用 SignalR相当容易.查看SignalR文档获 ...
- iOS开发系列--C语言之基础知识
概览 当前移动开发的趋势已经势不可挡,这个系列希望浅谈一下个人对IOS开发的一些见解,这个IOS系列计划从几个角度去说IOS开发: C语言 OC基础 IOS开发(iphone/ipad) Swift ...
- [.net 面向对象程序设计进阶] (28) 结束语——告别2015
[.net 面向对象程序设计进阶] (28) 结束语——告别2015 <.net面向对象程序设计进阶>这一系列文章写了太长的时间了,大概有半年没写,在年底又一口气写了好几篇.在整个过程中目 ...
- Linux 创建修改删除用户和组
200 ? "200px" : this.width)!important;} --> 介绍 在日常的维护过程中创建用户操作用的相对会多一些,但是在这个过程中涉及到的知识点就 ...
- Android APK是否需要预解压
今天在逛论坛的时候,发现有一个朋友问的问题.其主要目的,是想实现 玩家首次进入游戏的时候,或者新安装了版本的时候,对APK进行解压,写入SD卡.这样游戏运行过程中,将不会再从APK中读取资源. 以提高 ...
- Leetcode 刷题计划
Two Sum 21.4% Medium Given an array of integers, return indices of the two numbers such that t ...
- ES6新特性之 promise
新的ES6中引入了promise的概念,目的是让回调更为优雅.层层嵌套的回调会让javascript失去美感和可读性,同时javascript也推荐采用链式的方式去书写函数调用.于是Promise就应 ...
- HTTP学习一:HTTP基础知识
1 HTTP介绍 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议. 它的发展是万维网协会(World Wid ...