分區
分區就是把一個數據表的文件和索引分散存儲在不同的物理文件中。把一張表的數據分成N多個區塊,這些區塊可以在同一個磁盤上,也可以在不同的磁盤上,數據庫不同實現方式有所不同。
與分表不同,一張大表進行分區后,他還是一張表,不會變成二張表,但是他存放數據的區塊變多了。分區的概念,我覺得就想突破磁盤I/O瓶頸,想提高磁盤的讀寫能力,來增加數據庫的性能。
分區實現是比較簡單的,建立分區表,根建平常的表沒什么區別,并且對開發代碼端來說是透明。
postgresql10以上的自動分區分表功能:
1、首先創建主分區表:
create table fenbiao(
id int,
year varchar
) partition by list(year)
這里設置的是根據year列進行數據分表;創建后使用navicat是看不到的;
2.創建分表:
create table fenbiao_2017 partition of fenbiao for values in ('2017');
create table fenbiao_2018 partition of fenbiao for values in ('2018');
這樣這兩天數據會依靠規則插入到不同分表中,如果插入一條不符合規則的數據,則會報錯誤:no partition of relation "fenbiao" found for row.
分表
分表從表面意思上看呢,就是把一張表分成N多個小表,每一個小表都是完正的一張表。分表后數據都是存放在分表里,總表只是一個外殼,存取數據發生在一個一個的分表里面。
分表后單表的并發能力提高了,磁盤I/O性能也提高了。并發能力為什么提高了呢,因為查尋一次所花的時間變短了,如果出現高并發的話,總表可以根據不同 的查詢,將并發壓力分到不同的小表里面。
分庫分表
分庫分表把原本存儲于一個庫的數據分塊存儲到多個庫上,把原本存儲于一個表的數據分塊存儲到多個表上。
數據庫中的數據量不一定是可控的,在未進行分庫分表的情況下,隨著時間和業務的發展,庫中的表會越來越多,表中的數據量也會越來越大,相應地,數據操作,增刪改查的開銷也會越來越大;另外,一臺服務器的資源(CPU、磁盤、內存、IO等)是有限的,最終數據庫所能承載的數據量、數據處理能力都將遭遇瓶頸。
FreeSql.Repository 之分表
FreeSql 提供 AsTable 分表的基礎方法,GuidRepository 作為分存式倉儲將實現了分表與分庫(不支持跨服務器分庫)的封裝。
var logRepository = fsql.GetGuidRepository<Log>(null, oldname => $"{oldname}_201903");
上面我們得到一個日志倉儲按年月分表,使用它 CURD 最終會操作 Log_201903 表。
注意事項:
- 不能使用 CodeFirst 遷移分表,開發環境時仍然可以遷移 Log 表;
- 不可在分表分庫的實體類型中使用《延時加載》;
跨表查詢
var sql = fsql.Select<User>().AsTable((type, oldname) => "table_1").AsTable((type, oldname) => "table_2").AsTable((type, oldname) => "table_3").ToSql(a => a.Id);
得到SQL:
select * from (SELECT a."Id" as1 FROM "table_1" a) ftb
UNION ALL
select * from (SELECT a."Id" as1 FROM "table_2" a) ftb
UNION ALL
select * from (SELECT a."Id" as1 FROM "table_3" a) ftb
多表查詢:
var sql = fsql.Select<User>().LeftJoin<UserGroup>((a,b) => a.UserGroupId == b.Id).AsTable((type, oldname) => oldname + "_1").AsTable((type, oldname) => oldname + "_2").AsTable((type, oldname) => oldname + "_3").ToSql(a => a.Id);
期待更多發散。。。
巧用AsTable
var sql = fsql.Select<User>().AsTable((a, b) => "(select * from tb_topic where clicks > 10)").Page(1, 10).ToList()
系列文章導航
(一)入門
(二)自動遷移實體
(三)實體特性
(四)實體特性 Fluent Api
(五)插入數據
(六)批量插入數據
(七)插入數據時忽略列
(八)插入數據時指定列
(九)刪除數據
(十)更新數據
(十一)更新數據 Where
(十二)更新數據時指定列
(十三)更新數據時忽略列
(十四)批量更新數據
(十五)查詢數據
(十六)分頁查詢
(十七)聯表查詢
(十八)導航屬性
(十九)多表查詢
(二十)多表查詢 WhereCascade
(二十一)查詢返回數據
(二十二)Dto 映射查詢
(二十三)分組、聚合
(二十四)Linq To Sql 語法使用介紹
(二十五)延時加載
(二十六)貪婪加載 Include、IncludeMany、Dto、ToList
(二十七)將已寫好的 SQL 語句,與實體類映射進行二次查詢
(二十八)事務
(二十九)Lambda 表達式
(三十)讀寫分離
(三十一)分區分表
(三十二)Aop
(三十三)CodeFirst 類型映射
(三十四)CodeFirst 遷移說明
(三十五)CodeFirst 自定義特性