MongoDB与SqlSugar与Ado.Net对比
NET 4.+ & .NET CORE 高性能 轻量级 ORM框架,众多.NET框架中最容易使用的数据库访问技术
MongoDB与MySql的安装省略...虽然遇到了一些意外的情况,也花了一些时间,但是网上大都能找到解决方法,就不赘述了。
测试过程中使用的所有第三方库文件都可以通过Nuget获取:MySql.Data.dll,Newtonsoft.Json.dll,SqlSugar.dll,MongoDB.Driver.dll,MongoDB.Bson.dll
本文记录,对10000条数据的插入与读取速度,来简单对比三种访问数据库的方式哪一种用起来更方便更高效,当然,这可能是片面的,但是结论不是我的目的,我的目的是为了学习了解NoSql数据库。
考虑一下以下实体对象:Book与Tags一对多关系,要新建两张表,字段与实体对象中的属性一一对应
public class BaseEntity
{
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public string Guid { get; set; }
[SugarColumn(IsIgnore = true)]
public ObjectId id { get; set; }
}
public class Book : BaseEntity
{
/// <summary>
/// 标题
/// </summary>
public string Title { get; set; }
/// <summary>
/// 描述
/// </summary>
public string Description { get; set; }
/// <summary>
/// 作者
/// </summary>
public string Author { get; set; }
/// <summary>
/// 价格
/// </summary>
public decimal Price { get; set; }
/// <summary>
/// 标签
/// </summary>
[SugarColumn(IsIgnore = true)]
public List<Tags> Tags { get; set; }
}
public class Tags : BaseEntity
{
/// <summary>
/// 标签
/// </summary>
public string Tag { get; set; }
/// <summary>
/// 对应的书的Id
/// </summary>
public string BookId { get; set; }
}
建了两张表,就很头疼了,插入数据的时候,要分别插入,这样的效率是比较低的。这里直接考虑用SqlSugar插入10000条数据
private void btn_insert_mysql_Click(object sender, EventArgs e)
{
BookRepository db = new BookRepository();
System.Threading.Thread thread = new System.Threading.Thread(() =>
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Restart();
for (int i = ; i < ; i++)
{
Book book = CreateData(i);
db.Insert(book);
}
stopWatch.Stop();
WriteLog(string.Format("SqlSugar插入Mysql 10000 条数据耗时:{0}ms", stopWatch.ElapsedMilliseconds));
});
thread.Start();
}
public void Insert(Book book)
{
db.Insertable<Book>(book).ExecuteCommand();
db.Insertable<Tags>(book.Tags).ExecuteCommand();
}
再往MongoDB中插入10000条数据,MongoDB插入数据就很方便的了,啥都不用管,因为它的数据本来是以文档的方式存储的,一种类似于JSON对象的数据结构,叫BSON
private void btn_insert_mongodb_Click(object sender, EventArgs e)
{
MongoDbHelper<Book> db = new MongoDbHelper<Book>();
System.Threading.Thread thread = new System.Threading.Thread(() =>
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Restart();
for (int i = ; i < ; i++)
{
Book book = CreateData(i);
db.Insert(book);
}
stopWatch.Stop();
WriteLog(string.Format("插入MongoDB 10000 条数据耗时:{0}ms", stopWatch.ElapsedMilliseconds));
});
thread.Start();
}
public T Insert(T entity)
{
collection.InsertOne(entity);
return entity;
}
插入数据的耗时结果对比:
2018-09-24 13:43:05 插入MongoDB 10000 条数据耗时:3111ms
2018-09-24 13:43:14 SqlSugar插入Mysql 10000 条数据耗时:12924ms
数据准备好了之后,便开始测试查询。
SqlSugar查询所有数据:
使用sqlsugar查询数据有两种方式,一种分两次查询,这种方式最终得到的List中一共10000条数据,
另一种,连表查询,但是会有30000条数据,且要么返回匿名对象,返回值使用dynamic接收,或者新建一个View Model,总之,需要做一些其他的工作。
public List<Book> GetAll()
{
List<Book> lstBook = db.Queryable<Book>().ToList();
foreach (var book in lstBook)
{
book.Tags = db.Queryable<Tags>().Where(x => x.BookId == book.Guid).ToList();
}
return lstBook;
//var lstBook = db.Queryable<Book, Tags>((bk, tg) => new object[] { JoinType.Left, bk.Guid == tg.BooksId }).Select((bk, tg) => new VBook
// {
// Guid = bk.Guid,
// Author = bk.Author,
// Title = bk.Title,
// Description = bk.Description,
// Price = bk.Price,
// Tag = tg.Tag
// }).ToList();
//return lstBook;
}
Ado.Net查询:这是最原始的方式了,优势还是很明显的,写原生的sql语句,效率算是比较高了,省去了ORM解析lambda表达式,反射属性赋值等,SqlSugar是国内的开源项目,有时间的话,可以下载源代码看看。当
然Ado.Net操作数据库不方便的地方就是DataTable转实体对象了,字段多的时候,写的头都晕了,没有技术含量却要拼命的写啊写啊写....
下面的代码片段,查询出来有30000条数据,否则,只能查询两次,与上面使用的SqlSugar一样
public List<Book> GetAllByAdo()
{
List<Book> lstBook = new List<Book>();
string conn = "Data Source=127.0.0.1;port=3306;Initial Catalog=test;user id=test;password=123456;Charset=utf8;SslMode = none;";
string sql = "select * from book a,tags b where a.Guid=b.BookId";
DataTable dt = MySql.Data.MySqlClient.MySqlHelper.ExecuteDataset(conn, sql).Tables[];
foreach (DataRow dr in dt.Rows)
{
Book book = new Book
{
Guid = dr["Guid"].ToString(),
Author = dr["Author"].ToString(),
Title = dr["Title"].ToString(),
Description = dr["Description"].ToString(),
Price = decimal.Parse(dr["Price"].ToString()),
Tags = new List<Tags>() { new Tags { Guid = dr["Guid1"].ToString(), BookId = dr["BooksId"].ToString(), Tag = dr["Tag"].ToString() } }
};
lstBook.Add(book);
}
return lstBook;
}
MogoDB查询数据库简直不能太方便,不用做任何的操作,直接返回实体对象
public List<T> GetAll()
{
return collection.Find(_=>true).ToList();
}
对应以上结果:
1.使用NoSql的数据库,非常的高效,非常的方便。
2.加了索引后,对于sqlsugar查询效率提升太明显。
3.不管是使用怎样轻量级的ORM框架,效率都是赶不上写原生sql的。
其他代码片段:
/// <summary>
/// MongoDb帮助类
/// </summary>
public class MongoDB
{
private static readonly string connStr = "mongodb://127.0.0.1:27017";
private static readonly string dbName = "test";
private static IMongoDatabase db = null;
private static readonly object lockHelper = new object();
private MongoDB() { }
public static IMongoDatabase GetDb()
{
if (db == null)
{
lock (lockHelper)
{
if (db == null)
{
var client = new MongoClient(connStr);
db = client.GetDatabase(dbName);
}
}
}
return db;
}
}
public class MongoDbHelper<T> where T : BaseEntity
{
private IMongoDatabase db = null;
private IMongoCollection<T> collection = null;
public MongoDbHelper()
{
this.db = MongoDB.GetDb();
collection = db.GetCollection<T>(typeof(T).Name);
}
/// <summary>
/// 新增
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public T Insert(T entity)
{
collection.InsertOne(entity);
return entity;
}
/// <summary>
/// 查询所有数据
/// </summary>
/// <returns></returns>
public List<T> GetAll()
{
return collection.Find(_=>true).ToList();
}
}
public class DbContext
{
string conn = "Data Source=10.101.98.197;port=3306;Initial Catalog=test;user id=test;password=123456;Charset=utf8;SslMode = none;";
public DbContext()
{
db = new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = conn,
DbType = SqlSugar.DbType.MySql,
IsAutoCloseConnection = true
});
}
public SqlSugarClient db;
}
public class BookRepository : DbContext
{
public List<Book> GetAllBooks()
{
List<Book> list = db.Queryable<Book>().ToList();
return list;
}
public List<Tags> GetTagsByBooksId(string bookid)
{
return db.Queryable<Tags>().Where(x => x.BookId == bookid).ToList();
}
public void Insert(Book book)
{
db.Insertable<Book>(book).ExecuteCommand();
db.Insertable<Tags>(book.Tags).ExecuteCommand();
}
public List<VBook> GetAll()
{
//List<Book> lstBook = db.Queryable<Book>().ToList();
//foreach (var book in lstBook)
//{
// book.Tags = db.Queryable<Tags>().Where(x => x.BookId == book.Guid).ToList();
//}
//return lstBook;
var lstBook = db.Queryable<Book, Tags>((bk, tg) => new object[] { JoinType.Left, bk.Guid == tg.BookId }).Select((bk, tg) => new VBook
{
Guid = bk.Guid,
Author = bk.Author,
Title = bk.Title,
Description = bk.Description,
Price = bk.Price,
Tag = tg.Tag
}).ToList();
return lstBook;
}
public List<Book> GetAllByAdo()
{
List<Book> lstBook = new List<Book>();
string conn = "Data Source=127.0.0.1;port=3306;Initial Catalog=test;user id=test;password=123456;Charset=utf8;SslMode = none;";
string sql = "select * from book a,tags b where a.Guid=b.BookId";
DataTable dt = MySql.Data.MySqlClient.MySqlHelper.ExecuteDataset(conn, sql).Tables[];
foreach (DataRow dr in dt.Rows)
{
Book book = new Book
{
Guid = dr["Guid"].ToString(),
Author = dr["Author"].ToString(),
Title = dr["Title"].ToString(),
Description = dr["Description"].ToString(),
Price = decimal.Parse(dr["Price"].ToString()),
Tags = new List<Tags>() { new Tags { Guid = dr["Guid1"].ToString(), BookId = dr["BookId"].ToString(), Tag = dr["Tag"].ToString() } }
};
lstBook.Add(book);
}
return lstBook;
}
}
工具:

MongoDB与SqlSugar与Ado.Net对比的更多相关文章
- MongoDB与衍生版的TokuMX对比
为什么会出现TokuMX呢? 查阅大量的资料和翻阅一些大牛的博客发现,MongoDB作为nosql派别的一个典型非关系型数据库其实存在许多缺陷不足之处. 然后肯定就会有有人跳出来,来做一个衍生的东西, ...
- mongodb,redis,mysql 简要对比
本篇内容大部分不是原创,转载的会贴有链接. 准备学习下数据库,想对目前的主流数据库做一个简单的了解分析,就搜集了资料整理到了一块. 当下主流的要数NoSql数据库了,拥有强大的高并发能力. mongo ...
- Mongodb操作之查询(循序渐进对比SQL语句)
工具推荐:Robomongo,可自行百度寻找下载源,个人比较推荐这个工具,相比较mongoVUE则更加灵活. 集合简单查询方法 mongodb语法:db.collection.find() //co ...
- MongoDB批量操作及与MySQL效率对比
本文主要通过批量与非批量对比操作的方式介绍MongoDB的bulkWrite()方法的使用.顺带与关系型数据库MySQL进行对比,比较这两种不同类型数据库的效率.如果只是想学习bulkWrite()的 ...
- Mongodb操作之查询(循序渐进对比SQL语句)(转http://www.tuicool.com/articles/UzQj6rF)
工具推荐:Robomongo,可自行百度寻找下载源,个人比较推荐这个工具,相比较mongoVUE则更加灵活. 集合简单查询方法 mongodb语法:db.collection.find() //co ...
- MySQL和Mongodb的区别与应用场景对比
MySQL是关系型数据库 优势: 在不同的引擎上有不同 的存储方式. 查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高. 开源数据库的份额在不断增加,mysql的份额页在持续增长. 缺点 ...
- mongodb查询语句与sql语句对比
左边是mongodb查询语句,右边是sql语句.对照着用,挺方便. db.users.find() select * from users db.users.find({"age" ...
- MongoDB(五)mongo语法和mysql语法对比学习
我们总是在对比中看到自己的优点和缺点,对于mongodb来说也是一样,对比学习让我们尽快的掌握关于mongodb的基础知识. mongodb与MySQL命令对比 关系型数据库一般是由数据库(datab ...
- MySQL与MongoDB的操作对比,以及区别
MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库.它们各有各的优点,关键是看用在什么地方 ...
随机推荐
- Python3 List list()方法
Python3 List list()方法 Python3 列表 描述 list() 方法用于将元组或字符串转换为列表. 注:元组与列表是非常类似的,区别在于元组的元素值不能修改,元组是放在括号中, ...
- UI设计不就是画线框,凭什么年薪30W?
作为一枚界面设计师 我真的很想为UI设计抱不平啊!! UI设计真是一个备受不解的职业 常会被误解,然后出现以下场景 程序欧巴: 界面画好没?按钮圆的方的不都能用吗?纠结那多干嘛? 产品经理: 这次我们 ...
- Banner设计的视觉导向原则分析
Banner的布局方式 常见的Banner布局方式有五种,以下分别给出大致样式: 两栏式: 三栏式: 组合式: 一体式: 对角线式: 以上几种布局方式不分好坏,对于不同的主题.素材和文案可以自行选 ...
- 二进制搭建kubernetes多master集群【二、配置flannel网络】
上一篇我们已经搭建etcd高可用集群,参考:二进制搭建kubernetes多master集群[一.使用TLS证书搭建etcd集群] 此文将搭建flannel网络,目的使跨主机的docker能够互相通信 ...
- 2018.07.23 hdu5828 Rikka with Sequence(线段树)
传送门 这道题维护区间加,区间开根,区间求和. 线段树常规操作. 首先回忆两道简单得多的线段树. 第一个:区间覆盖,区间加,区间求和. 第二个:区间开根,区间求和. 这两个是名副其实的常规操作. 但这 ...
- Map的常用操作
public static void main(String[] args) { Map<String, String> map = new HashMap<>(); map. ...
- HDU 5956 The Elder (树上斜率DP)
题意:给定上一棵树,然后每条边有一个权值,然后每个点到 1 的距离有两种,第一种是直接回到1,花费是 dist(1, i)^2,还有另一种是先到另一个点 j,然后两从 j 向1走,当然 j 也可以再向 ...
- Linux下Git安装及配置
转载自:https://blog.csdn.net/u013256816/article/details/54743470:加了一些自己的注释. yum安装 这里采用的是CentOS系统,如果采用yu ...
- RESTful架构概念
本文转载自:http://www.ruanyifeng.com/blog/2011/09/restful.html 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软 ...
- DIV+CSS实战(五)
一.说明 前面实现了关键词订阅模块,现在实现站点订阅模块,主要实现的是站点添加界面.站点添加界面里面实现一个提示框不在提示的功能(保存到cookie中),还有就是实现一个站点的选择框,包括输入文字自动 ...