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索引结构. 索引的使用要恰到好处,其使用原则如下: 在经常进行连接 ...
随机推荐
- CC2530学习路线-基础实验-GPIO 控制LED灯亮灭(1)
目录 1.前期预备知识 1.1 新大陆ZigBee模块LED灯电路 1.2 CC2530相关寄存器 1.3 寄存器操作技巧 1.4 CPU空转延时 1.4 操作流程图 2.程序代码 The End 1 ...
- [.net]基元线程同步构造
/* 基元线程同步构造 用户模式构造: 易变构造(Volatile Construct) 互锁构造(Interlocked Construct):自旋锁(Spinlock) 乐观锁(Optimisti ...
- Java基础学习篇---------String、集合的学习
一.String常用的方法: 1. == 实质比较两个对象的地址数值 String a = "hello" (hello为匿名对象) String a1 = "hell ...
- Android 美学设计基础 <1>
在做原型的时候,和设计师交流的过程中,发现在设计安卓交互的过程中,其实是存在一些基本规则的.那这些规则,可以保证第一应用美观,第二不会出现反人类的开发难度,第三,用设计师的话说就是可能会有“最好的体现 ...
- maven项目发布到tomcat后没有lib目录解决方案
maven项目放入tomcat中时,总是报错,而且这些jar都是真实存在的,错误如下: maven eclipse tomcat java.lang.ClassNotFoundException: o ...
- 深入理解java内存模型
深入理解Java内存模型(一)——基础 深入理解Java内存模型(二)——重排序 深入理解Java内存模型(三)——顺序一致性 深入理解Java内存模型(四)——volatile 深入理解Java内存 ...
- 使用win10自带邮件应用发送文件
之前的电脑装过邮件客户端,想发送文件给别人时,只需要“右键文件——发送到邮件”,就能把文件作为附件发送给对方.新电脑win10系统自带邮件客户端,所以就想直接用.但是右键发送到邮件没有关联上,用不了. ...
- day 44 django 学习入门
前情提要: 终于学到了Django ...古川小姐姐好流b .....7天学完.....脑壳疼..为了出了这个小火箭.. 详细参考官网. https://www.django.cn/ 中文网站 一: ...
- iOS--线程的创建
1.获取当前线程 NSThread *current=[NSThread currentThread]; 2.获取主线程的另外一种方式 NSThread *main=[NSThread mainThr ...
- POJ 2304
#include<iostream>// cheng da cai zi 11. 18 解锁问题 using namespace std; #define f 360 int main() ...