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索引结构. 索引的使用要恰到好处,其使用原则如下: 在经常进行连接 ...
随机推荐
- mysql恢复备份错误:Got a packet bigger than 'max_allowed_packet' bytes
最近恢复mysql数据库备份时,出现了一个错误:Got a packet bigger than 'max_allowed_packet' bytes 该问题主要是由于mysql的my.ini文件中设 ...
- Mac 切换到行首和行末的方法
苹果笔记本没有home键和end键 但是使用 command + 方向键左键可以回到行首, command + 方向键右键可以去到行末
- setInterval传递参数
参照:https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout 平时我们使用定时器的时 ...
- Flask从入门到精通之Flask-Bootstrap的使用
Bootstrap(http://getbootstrap.com/)是Twitter 开发的一个开源框架,它提供的用户界面组件可用于创建整洁且具有吸引力的网页,而且这些网页还能兼容所有现代Web 浏 ...
- html5 页面基本骨架
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- java中使用OpenOffice
1. 下载软件/傻瓜安装 OpenOffice 下载地址http://www.openoffice.org/ JodConverter 下载地址http://sourceforge.net/proje ...
- AFNetworking 报3840
工作中遇到前后台交互,前端解析不了后端返回的数据格式 ,原因在于没有标准统一的请求格式 这是个坑,但是还是有办法修复 错误提示: Error Domain=NSCocoaErrorDomain Cod ...
- [Noi2014]购票 斜率优化DP+可持久化凸包
貌似网上大部分题解都是CDQ分治+点分治然后再斜率优化DP,我貌似并没有用这个方法. 这一题跟这题有点像,只不过多了一个l的限制 如果说直接跑斜率优化DP,存储整个序列的话,显然是不行的,如图所示(图 ...
- POJ 2328
#include<iostream> #include<stdio.h> #include<string> using namespace std; int mai ...
- Linux CentOS7系统配置nginx服务器
作为一个以服务器为主要市场的操作系统,主要就是对客户端的请求进行响应,进行处理的.在经历过系统镜像安装和本地配置好ssh功能后,接下来进行服务器的安装,这里我以nginx为主,介绍一下如何安装ngin ...