分表 - 從表面意思上看呢,就是把一張表分成N多個小表,每一個小表都是完正的一張表,分表后資料都是存放在分表里,總表只是一個外殼,存取資料發生在一個一個的分表里面,分表后單表的并發能力提高了,磁盤I/O性能也提高了,并發能力為什么提高了呢,因為查尋一次所花的時間變短了,如果出現高并發的話,總表可以根據不同 的查詢,將并發壓力分到不同的小表里面,
分庫 - 把原本存盤于一個庫的資料分塊存盤到多個庫上,把原本存盤于一個表的資料分塊存盤到多個表上,資料庫中的資料量不一定是可控的,在未進行分表分庫的情況下,隨著時間和業務的發展,庫中的表會越來越多,表中的資料量也會越來越大,相應地,資料操作,增刪改查的開銷也會越來越大;另外,一臺服務器的資源(CPU、磁盤、記憶體、IO等)是有限的,最終資料庫所能承載的資料量、資料處理能力都將遭遇瓶頸,

2|0情懷滿滿
分表、分庫在 .NET 下可謂是老大難題,簡單點可以使用類似 mycat 中間件,但是就 .NET 平臺的自身生態,很缺乏類似 sharding-jdbc 這樣強大的輪子,
本人就自身有限的技術水平和經驗,對分表、分庫進行分析,實作出自成一套的使用方法,雖然不極 sharding-jdbc 強大,但是還算比較通用、簡單,但愿有朝一日出現一批真正 .NET 大神,造出偉大的開源專案,實作你我心中的抱負,
這套分表、分庫方法是建立在 .NET ORM SqlSugar之上做的,內容可能比較抽象,敬請諒解!后續會詳解各種租戶設計方案,除了按欄位區分租戶,還包括分庫、分表的方案,敬請關注!

3|0入戲準備
SqlSugar是 .Net ORM,能支持 .NetFramework4.0+、.NetCore、Xamarin、XAUI、Blazor、以及還有說不出來的運行平臺,因為代碼綠色無依賴,支持新平臺非常簡單,目前單元測驗數量:5000+,Nuget下載數量:180K+,原始碼幾乎每天都有提交, SqlSugar GITHUB:https://github.com/donet5/SqlSugar,為開源社區出一份力,
QQ群:225982985(已滿)、726648662(在線)、995692596(在線)
為什么要重復造輪子?
SqlSugar主要優勢在于易用性上,基本是開箱即用,在不同資料庫之間切換兼容性比較好,作者花了大量的時間精力在這個專案,肯請您花半小時了解下專案,謝謝,功能特性如下:
- 支持 CodeFirst 對比結構變化遷移;
- 支持 DbFirst 從資料庫匯入物體類;
- 支持 豐富的運算式函式,自定義決議;
- 支持 批量添加、批量更新、BulkCopy;
- 支持 導航屬性,貪婪加載、延時加載、級聯保存;
- 支持 讀寫分離、分表分庫,租戶設計;
- 支持 MySql/SqlServer/PostgreSQL/Oracle/Sqlite/達夢/神通/人大金倉;
SqlSugar使用非常簡單,【單機資料庫】只需要定義一個 SqlSugarScope物件即可:
//創建資料庫物件 SqlSugarScope 用法小有區別
static SqlSugarScope scope= new SqlSugarScope(new ConnectionConfig()
{
ConnectionString = "Server=.xxxxx",//連接符字串
DbType = DbType.SqlServer,//資料庫型別
IsAutoCloseConnection = true //不設成true要手動close
})

4|0分表
既然是分表,那就大膽認為他是操作【單機資料庫】,只需要對物體類進行動態映射表名即可實作,SqlSugar原生用法提供了自動分表語法,例如:
//根據物體自動同步所有的分表結構
db.CodeFirst.SplitTables().InitTables<SplitTestTable>();
//插入時自動分表
var data = https://www.cnblogs.com/sunkaixuan/archive/2021/11/07/new SplitTestTable()
{
CreateTime=Convert.ToDateTime("2019-12-1"),
Name="jack"
};
db.Insertable(data).SplitTable().ExecuteReturnSnowflakeId();//插入并回傳雪花ID
SplitTable除了插入資料并且建表和同步結構外,還可以洗掉、查詢、和更新操作
var lis2t = db.Queryable<OrderSpliteTest>() .SplitTable(DateTime.Now.Date.AddYears(-1), DateTime.Now) .ToOffsetPage(1,2); //根據時間分表查詢
多數情況,我們都建議提前創建好分表,如果按月分表,手工創建一年的分表,
目前這種算是比較簡單入門的方案,遠不及 mycat、sharding-jdbc 那么智能,比如:
- 不能利用分表欄位自動進行分表映射;
- 不能在查詢時根據 where 條件自動映射分表,甚至跨多個分表的聯合查詢;

5|0分庫(跨服務器)
分庫,但是在同一個資料庫服務器實體下,這種情況也可以使用 AsTable 方式進行操作,如下:
SqlSugarClient db = new SqlSugarClient(new List<ConnectionConfig>()
{
new ConnectionConfig(){ ConfigId="0", DbType=DbType.SqlServer, ConnectionString=Config.ConnectionString,IsAutoCloseConnection=true },
new ConnectionConfig(){ ConfigId="1", DbType=DbType.MySql, ConnectionString=Config.ConnectionString4 ,IsAutoCloseConnection=true }
});
分庫之后,老大難題是事務, SqlSugar自帶多租戶事務
var mysqldb = db.GetConnection("1");//獲取config為1的資料庫物件
var sqlServerdb = db.GetConnection("0");//獲取默認物件
mysqldb.Queryable<Order>().ToList();
sqlServerdb.Queryable<Order>().ToList();
6|0寫在最后
.NET 生態還處于較弱的狀態,呼吁大家支持、踴躍參與開源專案,為下一個 .NET 開源社區五年計劃做貢獻,
希望正在使用的、善良的您能動一動小手指,把文章轉發一下,讓更多人知道 .NET 有這樣一個好用的 ORM 存在,謝謝了!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/351879.html
標籤:.NET技术
