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索引结构. 索引的使用要恰到好处,其使用原则如下: 在经常进行连接 ...
随机推荐
- C#获取微信二维码显示到wpf
微信的api开放的二维码是一个链接地址,而我们要将这个二维码显示到客户端.方式很多,今天我们讲其中一种. /// <summary> /// 获取图片路径 /// </summary ...
- “全栈2019”Java多线程第二十六章:同步方法生产者与消费者线程
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- robot framework 测试/预发/线上环境快捷切换
通常情况下布署的三套环境:测试.预发及线上环境.调试或者辅助验证测试时,切环境改变量甚是麻烦.这些变量包括但不限于:一些url信息,数据库信息,预置用户信息等. 切换环境方法一:使用变量文件,通过判断 ...
- 在node中使用promise上传图片到七牛云
为了分摊个人服务器压力.提升图片下载上传的速度,使用七牛云保存用户上传的图片. 后台基于express搭建的,上传使用七牛云第三方nodejs-sdk.由于七牛云上传图片只能单个进行,并且考虑到上传完 ...
- xss跨站脚本攻击汇总
- Xcode 10 如何创建自定义 Snippet
 或者 
- python学习笔记05-列表
Python3已经不区分整型和长整型 列表: 查 用切片查 [n:n:n] A[1:2] 只能取出一个数 顾头不顾尾 存在步长 可以按步长1取 也可以按设置其他步长取 若要逆序取数 步长 ...
- Numpy学习50例
基础部分 1.导入numpy模块 import numpy as np 2.查看numpy版本信息 print(np.__version__) numpy的主要对象的多维数组Ndarray.Numpy ...
- 【xsy1147】 异或(xor) 可持久化trie
我的脑回路可能比较奇怪. 我们对这些询问离线,将所得序列${a}$的后缀和建$n$棵可持久化$trie$. 对于一组询问$(l,r,x)$,我们在主席树上询问第$l$棵树$-$第r$+1$棵树中与$s ...
- easyUI制作slider小滑块,可拖动和精确输入
借助easyUI制作.完善slider小滑块. 可拖动.和在右边输入框精确输入 效果图: html代码: <div class="text_fl" >亮度设置:< ...