SqlSugar

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一对多关系,要新建两张表,字段与实体对象中的属性一一对应

  1. public class BaseEntity
  2. {
  3. [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
  4. public string Guid { get; set; }
  5. [SugarColumn(IsIgnore = true)]
  6. public ObjectId id { get; set; }
  7. }
  1. public class Book : BaseEntity
  2. {
  3. /// <summary>
  4. /// 标题
  5. /// </summary>
  6. public string Title { get; set; }
  7. /// <summary>
  8. /// 描述
  9. /// </summary>
  10. public string Description { get; set; }
  11. /// <summary>
  12. /// 作者
  13. /// </summary>
  14. public string Author { get; set; }
  15. /// <summary>
  16. /// 价格
  17. /// </summary>
  18. public decimal Price { get; set; }
  19. /// <summary>
  20. /// 标签
  21. /// </summary>
  22. [SugarColumn(IsIgnore = true)]
  23. public List<Tags> Tags { get; set; }
  24. }
  1. public class Tags : BaseEntity
  2. {
  3. /// <summary>
  4. /// 标签
  5. /// </summary>
  6. public string Tag { get; set; }
  7. /// <summary>
  8. /// 对应的书的Id
  9. /// </summary>
  10. public string BookId { get; set; }
  11. }

建了两张表,就很头疼了,插入数据的时候,要分别插入,这样的效率是比较低的。这里直接考虑用SqlSugar插入10000条数据

  1. private void btn_insert_mysql_Click(object sender, EventArgs e)
  2. {
  3. BookRepository db = new BookRepository();
  4. System.Threading.Thread thread = new System.Threading.Thread(() =>
  5. {
  6. Stopwatch stopWatch = new Stopwatch();
  7. stopWatch.Restart();
  8. for (int i = ; i < ; i++)
  9. {
  10. Book book = CreateData(i);
  11. db.Insert(book);
  12. }
  13. stopWatch.Stop();
  14. WriteLog(string.Format("SqlSugar插入Mysql 10000 条数据耗时:{0}ms", stopWatch.ElapsedMilliseconds));
  15. });
  16. thread.Start();
  17. }
  1. public void Insert(Book book)
  2. {
  3. db.Insertable<Book>(book).ExecuteCommand();
  4. db.Insertable<Tags>(book.Tags).ExecuteCommand();
  5. }

再往MongoDB中插入10000条数据,MongoDB插入数据就很方便的了,啥都不用管,因为它的数据本来是以文档的方式存储的,一种类似于JSON对象的数据结构,叫BSON

  1. private void btn_insert_mongodb_Click(object sender, EventArgs e)
  2. {
  3. MongoDbHelper<Book> db = new MongoDbHelper<Book>();
  4. System.Threading.Thread thread = new System.Threading.Thread(() =>
  5. {
  6. Stopwatch stopWatch = new Stopwatch();
  7. stopWatch.Restart();
  8. for (int i = ; i < ; i++)
  9. {
  10. Book book = CreateData(i);
  11. db.Insert(book);
  12. }
  13. stopWatch.Stop();
  14. WriteLog(string.Format("插入MongoDB 10000 条数据耗时:{0}ms", stopWatch.ElapsedMilliseconds));
  15. });
  16. thread.Start();
  17. }
  1. public T Insert(T entity)
  2. {
  3. collection.InsertOne(entity);
  4. return entity;
  5. }

插入数据的耗时结果对比:

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,总之,需要做一些其他的工作。

  1. public List<Book> GetAll()
  2. {
  3. List<Book> lstBook = db.Queryable<Book>().ToList();
  4. foreach (var book in lstBook)
  5. {
  6. book.Tags = db.Queryable<Tags>().Where(x => x.BookId == book.Guid).ToList();
  7. }
  8. return lstBook;
  9. //var lstBook = db.Queryable<Book, Tags>((bk, tg) => new object[] { JoinType.Left, bk.Guid == tg.BooksId }).Select((bk, tg) => new VBook
  10. // {
  11. // Guid = bk.Guid,
  12. // Author = bk.Author,
  13. // Title = bk.Title,
  14. // Description = bk.Description,
  15. // Price = bk.Price,
  16. // Tag = tg.Tag
  17. // }).ToList();
  18. //return lstBook;
  19. }

Ado.Net查询:这是最原始的方式了,优势还是很明显的,写原生的sql语句,效率算是比较高了,省去了ORM解析lambda表达式,反射属性赋值等,SqlSugar是国内的开源项目,有时间的话,可以下载源代码看看。当

然Ado.Net操作数据库不方便的地方就是DataTable转实体对象了,字段多的时候,写的头都晕了,没有技术含量却要拼命的写啊写啊写....

下面的代码片段,查询出来有30000条数据,否则,只能查询两次,与上面使用的SqlSugar一样

  1. public List<Book> GetAllByAdo()
  2. {
  3. List<Book> lstBook = new List<Book>();
  4. string conn = "Data Source=127.0.0.1;port=3306;Initial Catalog=test;user id=test;password=123456;Charset=utf8;SslMode = none;";
  5. string sql = "select * from book a,tags b where a.Guid=b.BookId";
  6. DataTable dt = MySql.Data.MySqlClient.MySqlHelper.ExecuteDataset(conn, sql).Tables[];
  7. foreach (DataRow dr in dt.Rows)
  8. {
  9. Book book = new Book
  10. {
  11. Guid = dr["Guid"].ToString(),
  12. Author = dr["Author"].ToString(),
  13. Title = dr["Title"].ToString(),
  14. Description = dr["Description"].ToString(),
  15. Price = decimal.Parse(dr["Price"].ToString()),
  16. Tags = new List<Tags>() { new Tags { Guid = dr["Guid1"].ToString(), BookId = dr["BooksId"].ToString(), Tag = dr["Tag"].ToString() } }
  17. };
  18. lstBook.Add(book);
  19. }
  20. return lstBook;
  21. }

MogoDB查询数据库简直不能太方便,不用做任何的操作,直接返回实体对象

  1. public List<T> GetAll()
  2. {
  3. return collection.Find(_=>true).ToList();
  4. }
查询结果耗时对比:
 
2018-09-24 13:44:00 查询MongoDB 10000 条数据耗时:312ms    查询一次,10000条数据
 
2018-09-24 13:44:14 Ado.Net查询Mysql 10000 条数据耗时:529ms    查询一次,30000条数据    没有索引
 
2018-09-24 13:44:46 SqlSugar查询Mysql 10000 条数据耗时:26567ms    查询一次,30000条数据    没有索引
 
2018-09-24 13:51:25 SqlSugar查询Mysql 10000 条数据耗时:87318ms    查询两次,10000条数据    没有索引
 
 
2018-09-24 15:09:03 Ado.Net查询Mysql 10000 条数据耗时:488ms    查询一次,30000条数据 加了索引
 
2018-09-24 15:08:14 SqlSugar查询Mysql 10000 条数据耗时:504ms    查询一次,30000条数据 加了索引
 
2018-09-24 15:05:14 SqlSugar查询Mysql 10000 条数据耗时:4786ms    查询两次,10000条数据 加了索引
 

对应以上结果:

1.使用NoSql的数据库,非常的高效,非常的方便。

2.加了索引后,对于sqlsugar查询效率提升太明显。

3.不管是使用怎样轻量级的ORM框架,效率都是赶不上写原生sql的。

其他代码片段:

  1. /// <summary>
  2. /// MongoDb帮助类
  3. /// </summary>
  4. public class MongoDB
  5. {
  6. private static readonly string connStr = "mongodb://127.0.0.1:27017";
  7. private static readonly string dbName = "test";
  8. private static IMongoDatabase db = null;
  9. private static readonly object lockHelper = new object();
  10. private MongoDB() { }
  11. public static IMongoDatabase GetDb()
  12. {
  13. if (db == null)
  14. {
  15. lock (lockHelper)
  16. {
  17. if (db == null)
  18. {
  19. var client = new MongoClient(connStr);
  20. db = client.GetDatabase(dbName);
  21. }
  22. }
  23. }
  24. return db;
  25. }
  26. }
  27. public class MongoDbHelper<T> where T : BaseEntity
  28. {
  29. private IMongoDatabase db = null;
  30. private IMongoCollection<T> collection = null;
  31. public MongoDbHelper()
  32. {
  33. this.db = MongoDB.GetDb();
  34. collection = db.GetCollection<T>(typeof(T).Name);
  35. }
  36. /// <summary>
  37. /// 新增
  38. /// </summary>
  39. /// <param name="entity"></param>
  40. /// <returns></returns>
  41. public T Insert(T entity)
  42. {
  43. collection.InsertOne(entity);
  44. return entity;
  45. }
  46. /// <summary>
  47. /// 查询所有数据
  48. /// </summary>
  49. /// <returns></returns>
  50. public List<T> GetAll()
  51. {
  52. return collection.Find(_=>true).ToList();
  53. }
  54. }
  1. public class DbContext
  2. {
  3. string conn = "Data Source=10.101.98.197;port=3306;Initial Catalog=test;user id=test;password=123456;Charset=utf8;SslMode = none;";
  4. public DbContext()
  5. {
  6. db = new SqlSugarClient(new ConnectionConfig()
  7. {
  8. ConnectionString = conn,
  9. DbType = SqlSugar.DbType.MySql,
  10. IsAutoCloseConnection = true
  11. });
  12. }
  13. public SqlSugarClient db;
  14. }
  15. public class BookRepository : DbContext
  16. {
  17. public List<Book> GetAllBooks()
  18. {
  19. List<Book> list = db.Queryable<Book>().ToList();
  20. return list;
  21. }
  22. public List<Tags> GetTagsByBooksId(string bookid)
  23. {
  24. return db.Queryable<Tags>().Where(x => x.BookId == bookid).ToList();
  25. }
  26. public void Insert(Book book)
  27. {
  28. db.Insertable<Book>(book).ExecuteCommand();
  29. db.Insertable<Tags>(book.Tags).ExecuteCommand();
  30. }
  31. public List<VBook> GetAll()
  32. {
  33. //List<Book> lstBook = db.Queryable<Book>().ToList();
  34. //foreach (var book in lstBook)
  35. //{
  36. // book.Tags = db.Queryable<Tags>().Where(x => x.BookId == book.Guid).ToList();
  37. //}
  38. //return lstBook;
  39. var lstBook = db.Queryable<Book, Tags>((bk, tg) => new object[] { JoinType.Left, bk.Guid == tg.BookId }).Select((bk, tg) => new VBook
  40. {
  41. Guid = bk.Guid,
  42. Author = bk.Author,
  43. Title = bk.Title,
  44. Description = bk.Description,
  45. Price = bk.Price,
  46. Tag = tg.Tag
  47. }).ToList();
  48. return lstBook;
  49. }
  50. public List<Book> GetAllByAdo()
  51. {
  52. List<Book> lstBook = new List<Book>();
  53. string conn = "Data Source=127.0.0.1;port=3306;Initial Catalog=test;user id=test;password=123456;Charset=utf8;SslMode = none;";
  54. string sql = "select * from book a,tags b where a.Guid=b.BookId";
  55. DataTable dt = MySql.Data.MySqlClient.MySqlHelper.ExecuteDataset(conn, sql).Tables[];
  56. foreach (DataRow dr in dt.Rows)
  57. {
  58. Book book = new Book
  59. {
  60. Guid = dr["Guid"].ToString(),
  61. Author = dr["Author"].ToString(),
  62. Title = dr["Title"].ToString(),
  63. Description = dr["Description"].ToString(),
  64. Price = decimal.Parse(dr["Price"].ToString()),
  65. Tags = new List<Tags>() { new Tags { Guid = dr["Guid1"].ToString(), BookId = dr["BookId"].ToString(), Tag = dr["Tag"].ToString() } }
  66. };
  67. lstBook.Add(book);
  68. }
  69. return lstBook;
  70. }
  71. }

工具:

每天进步一点点.....
 

MongoDB与SqlSugar与Ado.Net对比的更多相关文章

  1. MongoDB与衍生版的TokuMX对比

    为什么会出现TokuMX呢? 查阅大量的资料和翻阅一些大牛的博客发现,MongoDB作为nosql派别的一个典型非关系型数据库其实存在许多缺陷不足之处. 然后肯定就会有有人跳出来,来做一个衍生的东西, ...

  2. mongodb,redis,mysql 简要对比

    本篇内容大部分不是原创,转载的会贴有链接. 准备学习下数据库,想对目前的主流数据库做一个简单的了解分析,就搜集了资料整理到了一块. 当下主流的要数NoSql数据库了,拥有强大的高并发能力. mongo ...

  3. Mongodb操作之查询(循序渐进对比SQL语句)

    工具推荐:Robomongo,可自行百度寻找下载源,个人比较推荐这个工具,相比较mongoVUE则更加灵活. 集合简单查询方法 mongodb语法:db.collection.find()  //co ...

  4. MongoDB批量操作及与MySQL效率对比

    本文主要通过批量与非批量对比操作的方式介绍MongoDB的bulkWrite()方法的使用.顺带与关系型数据库MySQL进行对比,比较这两种不同类型数据库的效率.如果只是想学习bulkWrite()的 ...

  5. Mongodb操作之查询(循序渐进对比SQL语句)(转http://www.tuicool.com/articles/UzQj6rF)

    工具推荐:Robomongo,可自行百度寻找下载源,个人比较推荐这个工具,相比较mongoVUE则更加灵活. 集合简单查询方法 mongodb语法:db.collection.find()  //co ...

  6. MySQL和Mongodb的区别与应用场景对比

    MySQL是关系型数据库 优势: 在不同的引擎上有不同 的存储方式. 查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高. 开源数据库的份额在不断增加,mysql的份额页在持续增长. 缺点 ...

  7. mongodb查询语句与sql语句对比

    左边是mongodb查询语句,右边是sql语句.对照着用,挺方便. db.users.find() select * from users db.users.find({"age" ...

  8. MongoDB(五)mongo语法和mysql语法对比学习

    我们总是在对比中看到自己的优点和缺点,对于mongodb来说也是一样,对比学习让我们尽快的掌握关于mongodb的基础知识. mongodb与MySQL命令对比 关系型数据库一般是由数据库(datab ...

  9. MySQL与MongoDB的操作对比,以及区别

    MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库.它们各有各的优点,关键是看用在什么地方 ...

随机推荐

  1. Minimum Cost(最小费用最大流,好题)

    Minimum Cost http://poj.org/problem?id=2516 Time Limit: 4000MS   Memory Limit: 65536K Total Submissi ...

  2. Spring编程式事务管理

    --------------------siwuxie095                                 Spring 编程式事务管理         以转账为例         ...

  3. OC 线程操作3 - NSOperation

    #import "ViewController.h" @interface ViewController () @end @implementation ViewControlle ...

  4. 22-maven-安装与配置

    转载:https://blog.csdn.net/wy727764020/article/details/80595451 Maven的安装以及eclipse中配置maven 2018年06月06日 ...

  5. ajax原理以及优缺点(转)

    1.ajax技术的背景不可否认,ajax技术的流行得益于google的大力推广,正是由于google earth.google suggest以及gmail等对ajax技术的广泛应用,催生了ajax的 ...

  6. Linux screen命令

    一.简介 GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件.用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换. GNU Screen可以看作是窗口管理器的 ...

  7. 数学整合 新(LUOGU)

    1.卡特兰数(P2532) 递推式:h(n)=C(2n,n)/(n+1) (n=0,1,2,...) 前十项(从零开始):1, 1, 2, 5, 14, 42, 132, 429, 1430, 486 ...

  8. exit--进程退出;wait--进程等待;execl--执行程序

    函数原型:void exit(int status) 参数说明:退出状态. 函数原型:pid_t wait(int *status) 头文件:#include<sys/types.h>,# ...

  9. Highcharts做柱状图怎样样每个柱子都是不同的颜色显示

    series: [{ data: [{'color':'#F6BD0F','y':11}, {'color':'#AFD8F8','y':12}, {'color':'#8BBA00','y':13} ...

  10. pyspider示例代码四:搜索引擎爬取

    搜索引擎爬取 #!/usr/bin/env python # -*- encoding: utf- -*- # Created on -- :: # Project: __git_lab_fix fr ...