C# Mysql Dapper和原生sql 插入和查询速度比较
1、表中有三个字段,已经有100多万条数据,每次插入10万条数据 时间单位:秒
秒 Dapper批量Model插入时间:40.6165513,Dapper单条Model插入时间:95.9492972,Dapper单条sql插入时间:91.0191095,原生单条sql插入时间:90.5096905
秒 Dapper批量Model插入时间:40.4729053,Dapper单条Model插入时间:99.0270506,Dapper单条sql插入时间:92.7325932,原生单条sql插入时间:91.9713511
秒 Dapper批量Model插入时间:41.0260065,Dapper单条Model插入时间:95.8173737,Dapper单条sql插入时间:90.9012987,原生单条sql插入时间:90.2153092
秒 Dapper批量Model插入时间:41.5675273,Dapper单条Model插入时间:101.9446306,Dapper单条sql插入时间:94.4770289,原生单条sql插入时间:92.9758614
测试时间代码
List<gk_area> lst = new List<gk_area>();
for (int i = ; i < ; i++)
{
gk_area tmp = new gk_area();
tmp.gk_AreaId = Guid.NewGuid().ToString("N");
tmp.gk_AreaName = "测试:" + tmp.gk_AreaId;
tmp.gk_DelFlag = "";
lst.Add(tmp);
}
if (true)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start(); // 开始监视代码运行时间
new DapperHelper().InsertBulk<gk_area>(lst); // 需要测试的代码 ....
stopwatch.Stop(); // 停止监视
TimeSpan timespan = stopwatch.Elapsed; // 获取当前实例测量得出的总时间
double seconds = timespan.TotalSeconds; // 总秒数
timeStr += "秒 Dapper批量Model插入时间:" + seconds + ",";
} lst = new List<gk_area>();
for (int i = ; i < ; i++)
{
gk_area tmp = new gk_area();
tmp.gk_AreaId = Guid.NewGuid().ToString("N");
tmp.gk_AreaName = "测试:" + tmp.gk_AreaId;
tmp.gk_DelFlag = "";
lst.Add(tmp);
}
if (true)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start(); // 开始监视代码运行时间
// 需要测试的代码 ....
foreach (var item in lst)
{
new DapperHelper().Insert<gk_area>(item);
}
stopwatch.Stop(); // 停止监视
TimeSpan timespan = stopwatch.Elapsed; // 获取当前实例测量得出的总时间
double seconds = timespan.TotalSeconds; // 总秒数
timeStr += "Dapper单条Model插入时间:" + seconds + ",";
} lst = new List<gk_area>();
for (int i = ; i < ; i++)
{
gk_area tmp = new gk_area();
tmp.gk_AreaId = Guid.NewGuid().ToString("N");
tmp.gk_AreaName = "测试:" + tmp.gk_AreaId;
tmp.gk_DelFlag = "";
lst.Add(tmp);
}
if (true)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start(); // 开始监视代码运行时间
// 需要测试的代码 ....
foreach (var item in lst)
{
new DapperHelper().ExcuteNonQuery("insert into gk_area (gk_AreaId,gk_AreaName) values ('" + item.gk_AreaId + "','" + item.gk_AreaName + "')");
}
stopwatch.Stop(); // 停止监视
TimeSpan timespan = stopwatch.Elapsed; // 获取当前实例测量得出的总时间
double seconds = timespan.TotalSeconds; // 总秒数
timeStr += "Dapper单条sql插入时间:" + seconds + ",";
} lst = new List<gk_area>();
for (int i = ; i < ; i++)
{
gk_area tmp = new gk_area();
tmp.gk_AreaId = Guid.NewGuid().ToString("N");
tmp.gk_AreaName = "测试:" + tmp.gk_AreaId;
tmp.gk_DelFlag = "";
lst.Add(tmp);
}
if (true)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start(); // 开始监视代码运行时间
// 需要测试的代码 ....
foreach (var item in lst)
{
new DapperHelper().ExecuteNonQuery1("insert into gk_area (gk_AreaId,gk_AreaName) values ('" + item.gk_AreaId + "','" + item.gk_AreaName + "')");
}
stopwatch.Stop(); // 停止监视
TimeSpan timespan = stopwatch.Elapsed; // 获取当前实例测量得出的总时间
double seconds = timespan.TotalSeconds; // 总秒数
timeStr += "原始单条sql插入时间:" + seconds + ",";
}
插库方法
#region +Insert 新增Model
/// <summary>
/// 新增
/// </summary>
/// <returns></returns>
public int Insert<T>(T t) where T : class, new()
{
int result = ;
try
{
using (MySqlConnection con = new MySqlConnection(connection))
{
string strSqlText = GetSqlInsert<T>(t);
result = con.Execute(strSqlText, t);
}
}
catch (Exception ex)
{
WriteLog(ex.ToString());
}
return result;
} private string GetSqlInsert<T>(T t)
{
Type type = t.GetType();
PropertyInfo[] properties = type.GetProperties();
string sqlText = "INSERT INTO {0} ({1}) VALUES ({2})"; StringBuilder fileds = new StringBuilder();
StringBuilder values = new StringBuilder();
foreach (var proper in properties)
{
if (!proper.CustomAttributes.Any(x => x.AttributeType == typeof(AutoKeyAttribute))
&& !proper.CustomAttributes.Any(x => x.AttributeType == typeof(DefaultAttribute)))
{
fileds.Append(proper.Name + ",");
values.Append("@" + proper.Name + ",");
}
}
sqlText = string.Format(sqlText, type.Name, fileds.ToString().TrimEnd(','), values.ToString().TrimEnd(','));
return sqlText;
} #endregion #region +InsertBulk 批量新增
/// <summary>
/// 批量新增
/// </summary>
/// <returns></returns>
public int InsertBulk<T>(List<T> list) where T : class, new()
{
int result = ;
try
{
using (MySqlConnection con = new MySqlConnection(connection))
{
string strSqlText = GetSqlInsertBulk<T>(list);
result = con.Execute(strSqlText, list);
}
}
catch (Exception ex)
{
WriteLog(ex.ToString());
}
return result;
} private string GetSqlInsertBulk<T>(List<T> list)
{
return list.Count() > ? GetSqlInsert(list[]) : "";
} #endregion /// <summary>
/// 原始sql
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public int ExecuteNonQuery1(string sql)
{
using (MySqlConnection conn = new MySqlConnection(connection))
{
MySqlCommand cmd = new MySqlCommand();
if (conn.State != ConnectionState.Open)
conn.Open(); cmd.Connection = conn;
cmd.CommandText = sql;
cmd.CommandType = CommandType.Text;
return cmd.ExecuteNonQuery();
}
}
2、表中存在3029949(300万)条数据 时间单位:秒
反射字段查询时间:22.651388,Dapper查询时间:9.7697742,原生查询1时间:13.8903755,原生查询2时间:16.1955305
反射字段查询时间:21.3172684,Dapper查询时间:9.7593554,原生查询1时间:14.3009033,原生查询2时间:15.085577
反射字段查询时间:21.8932407,Dapper查询时间:8.3832515,原生查询1时间:13.4945138,原生查询2时间:17.7821992
反射字段查询时间:21.9676583,Dapper查询时间:9.3833032,原生查询1时间:13.5412978,原生查询2时间:15.5048999
测试时间代码
if (true)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start(); // 开始监视代码运行时间
// 需要测试的代码 ....
var test1 = new DapperHelper().FindToList<gk_area>("select * from gk_area");
stopwatch.Stop(); // 停止监视
TimeSpan timespan = stopwatch.Elapsed; // 获取当前实例测量得出的总时间
double seconds = timespan.TotalSeconds; // 总秒数
timeStr += "反射字段查询时间:" + seconds + ",";
} if (true)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start(); // 开始监视代码运行时间
// 需要测试的代码 ....
var test2 = new DapperHelper().QueryToList<gk_area>("select * from gk_area");
stopwatch.Stop(); // 停止监视
TimeSpan timespan = stopwatch.Elapsed; // 获取当前实例测量得出的总时间
double seconds = timespan.TotalSeconds; // 总秒数
timeStr += "Dapper查询时间:" + seconds + ",";
} if (true)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start(); // 开始监视代码运行时间
// 需要测试的代码 ....
var test3 = new DapperHelper().GetDataTable("select * from gk_area");
stopwatch.Stop(); // 停止监视
TimeSpan timespan = stopwatch.Elapsed; // 获取当前实例测量得出的总时间
double seconds = timespan.TotalSeconds; // 总秒数
timeStr += "原始查询时间:" + seconds + ",";
}
if (true)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start(); // 开始监视代码运行时间
// 需要测试的代码 ....
var test3 = new DapperHelper().ExecuteDataTable("select * from gk_area");
stopwatch.Stop(); // 停止监视
TimeSpan timespan = stopwatch.Elapsed; // 获取当前实例测量得出的总时间
double seconds = timespan.TotalSeconds; // 总秒数
timeStr += "原始查询2时间:" + seconds + ",";
}
查库方法
#region +FindToList 查询数据集合 反射字段查询 废弃
/// <summary>
/// 同步查询数据集合
/// </summary>
/// <typeparam name="T">实体</typeparam>
/// <param name="sql">sql语句</param>
/// <param name="param">参数</param>
/// <param name="flag">true存储过程,false sql语句</param>
/// <returns>t</returns>
public List<T> FindToList<T>(string sql, DynamicParameters param = null, bool flag = false) where T : class, new()
{
IDataReader dataReader = null;
using (MySqlConnection con = new MySqlConnection(connection))
{
if (flag)
{
dataReader = con.ExecuteReader(sql, param, null, null, CommandType.StoredProcedure);
}
else
{
dataReader = con.ExecuteReader(sql, param, null, null, CommandType.Text);
}
if (dataReader == null || !dataReader.Read()) return null;
Type type = typeof(T);
List<T> tlist = new List<T>();
do
{
T t = new T();
foreach (var item in type.GetProperties())
{
for (int i = ; i < dataReader.FieldCount; i++)
{
//属性名与查询出来的列名比较
if (item.Name.ToLower() != dataReader.GetName(i).ToLower()) continue;
var kvalue = dataReader[item.Name];
if (kvalue == DBNull.Value) continue;
item.SetValue(t, kvalue, null);
break;
}
}
if (tlist != null) tlist.Add(t);
} while (dataReader.Read());
return tlist;
}
}
#endregion #region +QueryToList Dapper 查询数据集合
/// <summary>
/// 同步查询数据集合
/// </summary>
/// <typeparam name="T">实体</typeparam>
/// <param name="sql">sql语句</param>
/// <param name="param">参数</param>
/// <param name="flag">true存储过程,false sql语句</param>
/// <returns>t</returns>
public List<T> QueryToList<T>(string sql, DynamicParameters param = null, bool flag = false) where T : class, new()
{
List<T> list = null;
try
{
using (MySqlConnection con = new MySqlConnection(connection))
{
if (flag)
{
list = con.Query<T>(sql, param, null, true, null, CommandType.StoredProcedure) as List<T>;
}
else
{
list = con.Query<T>(sql, param, null, true, null, CommandType.Text) as List<T>;
}
}
}
catch (Exception ex)
{
WriteLog(ex.ToString());
}
return list;
}
#endregion /// <summary>
/// 原始查询1
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public DataTable GetDataTable(string sql)
{
//创建一个MySqlCommand对象
MySqlCommand cmd = new MySqlCommand();
//创建一个MySqlConnection对象
MySqlConnection conn = new MySqlConnection(connection); try
{
if (conn.State != ConnectionState.Open)
conn.Open(); cmd.Connection = conn;
cmd.CommandText = sql;
cmd.CommandType = CommandType.Text;
MySqlDataAdapter adapter = new MySqlDataAdapter();
adapter.SelectCommand = cmd;
DataTable ds = new DataTable();
adapter.Fill(ds);
//清除参数
cmd.Parameters.Clear();
conn.Close();
return ds;
}
catch (Exception e)
{
throw e;
}
} /// <summary>
/// 原始查询2
/// </summary>
/// <param name="SQLString"></param>
/// <returns></returns>
public DataTable ExecuteDataTable(string SQLString)
{
using (MySqlConnection conn = new MySqlConnection(connection))
{
DataSet ds = new DataSet();
try
{
conn.Open();
MySqlDataAdapter command = new MySqlDataAdapter(SQLString, conn);
command.Fill(ds, "ds");
}
catch (MySql.Data.MySqlClient.MySqlException ex)
{
throw new Exception(ex.Message);
}
return ds.Tables[];
}
}
C# Mysql Dapper和原生sql 插入和查询速度比较的更多相关文章
- Sql server2005 优化查询速度50个方法小结
Sql server2005 优化查询速度50个方法小结 Sql server2005优化查询速度51法查询速度慢的原因很多,常见如下几种,大家可以参考下. I/O吞吐量小,形成了瓶颈效应. ...
- JPA或Hibernate中使用原生SQL实现分页查询、排序
发生背景:前端展示的数据需要来自A表和D表拼接,A表和D表根据A表的主键进行关联,D表的非主键字段关联C表的主键,根据条件筛选出符合的数据,并且根据A表的主键关联B表的主键(多主键)的条件,过滤A表中 ...
- Hibernate运行原生sql并将查询的结果转化为对象
原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口.下面来描述如何使用这个API进行查询.标量查询(Scalar queri ...
- mysql处理海量数据时的一些优化查询速度方法
最近一段时间由于工作需要,开始关注针对Mysql数据库的select查询语句的相关优化方法. 由于在参与的实际项目中发现当mysql表的数据量达到百万级时,普通SQL查询效率呈直线下降,而且如果w ...
- Mysql处理海量数据时的一些优化查询速度方法(转)
最近一段时间由于工作需要,开始关注针对Mysql数据库的select查询语句的相关优化方法. 由于在参与的实际项目中发现当mysql表的数据量达到百万级时,普通SQL查询效率呈直线下降,而且如果whe ...
- Mysql处理海量数据时的一些优化查询速度方法【转】
最近一段时间由于工作需要,开始关注针对Mysql数据库的select查询语句的相关优化方法.由于在参与的实际项目中发现当mysql表的数据量达到百万级时,普通SQL查询效率呈直线下降,而且如果wher ...
- MySQL 处理海量数据时的一些优化查询速度方法
查询速度慢的原因 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O 吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6 ...
- ORACLE 查询不走索引的原因分析,解决办法通过强制索引或动态执行SQL语句提高查询速度
(一)索引失效的原因分析: <>或者单独的>,<,(有时会用到,有时不会) 有时间范围查询:oracle 时间条件值范围越大就不走索引 like "%_" ...
- 利用SQL索引提高查询速度
1.合理使用索引 索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率.现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构. 索引的使用要恰到好处,其使用原则如下: 在经常进行连接 ...
随机推荐
- Oracle function函数赋权
-- 1.赋权 -- 在原有权的账号下个执行 grant select on psprd.functionName to user; -- 2. 别名 -- 在需要使用别名的账号下执行 CREATE ...
- Day 42 协程. IO 并发
一.什么是协程? 是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 协程相比于线程切换效率更快了. ...
- udid iphone6 获取
http://www.udidregistration.org/how-to-find-udid-of-iphone-6.html
- CF 798B 渣渣题
题目链接:http://codeforces.com/contest/798/problem/B 此题是我打河工大校赛前一晚熬夜打CF时硬肛过去的B题,今天补题时,偶然看到dalao的代码,ORZ,s ...
- 实现一个算法,寻找字符串中出现次数最少的、并且首次出现位置最前的字符 如"cbaacfdeaebb",符合要求的是"f",因为他只出现了一次(次数最少)。并且比其他只出现一次的字符(如"d")首次出现的位置最靠前。
实现一个算法,寻找字符串中出现次数最少的.并且首次出现位置最前的字符如"cbaacfdeaebb",符合要求的是"f",因为他只出现了一次(次数最少).并且比其 ...
- C#获取获取北京时间多种方法
#region 获取网络时间 ///<summary> /// 获取中国国家授时中心网络服务器时间发布的当前时间 ///</summary> ///<returns> ...
- Install MySql on CentOS
Installing & Configuring MySQL Server This Howto will show you how to install MySQL 5.x, start t ...
- Java之集合(二十三)SynchronousQueue
转载请注明源出处:http://www.cnblogs.com/lighten/p/7515729.html 1.前言 本章介绍阻塞队列SynchronousQueue.之前介绍过LinkedTran ...
- docker 搭建 php-mysql-nginx-redis-rabbitmq环境
#创建redisdocker create -p 6379:6379 -v redis:/data --restart=always --name myredis redis #创建mysqldock ...
- git使用时的一下简单命令
一.简介 SVN集中式版本控制系统 分布式版本控制系统 二.使用git 1.git init 将这个命令变成git可管理的仓库 2.git add filename 将这个文件添加到仓库 3.git ...