分區就是把一個數據表的文件和索引分散存儲在不一樣的物理文件中。把一張表的數據分紅N多個區塊,這些區塊能夠在同一個磁盤上,也能夠在不一樣的磁盤上,數據庫不一樣實現方式有所不一樣。html
與分表不一樣,一張大表進行分區後,他仍是一張表,不會變成二張表,可是他存放數據的區塊變多了。分區的概念,我以爲就想突破磁盤I/O瓶頸,想提升磁盤的讀寫能力,來增長數據庫的性能。sql
分區實現是比較簡單的,創建分區表,根建日常的表沒什麼區別,而且對開發代碼端來講是透明。數據庫
postgresql10以上的自動分區分表功能:服務器
一、首先建立主分區表:併發
create table fenbiao( id int, year varchar ) partition by list(year)
這裏設置的是根據year列進行數據分表;建立後使用navicat是看不到的;高併發
2.建立分表:post
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多個小表,每個小表都是完正的一張表。分表後數據都是存放在分表裏,總表只是一個外殼,存取數據發生在一個一個的分表裏面。ui
分表後單表的併發能力提升了,磁盤I/O性能也提升了。併發能力爲何提升了呢,由於查尋一次所花的時間變短了,若是出現高併發的話,總表能夠根據不一樣 的查詢,將併發壓力分到不一樣的小表裏面。日誌
分庫分表把本來存儲於一個庫的數據分塊存儲到多個庫上,把本來存儲於一個表的數據分塊存儲到多個表上。
數據庫中的數據量不必定是可控的,在未進行分庫分表的狀況下,隨着時間和業務的發展,庫中的表會愈來愈多,表中的數據量也會愈來愈大,相應地,數據操做,增刪改查的開銷也會愈來愈大;另外,一臺服務器的資源(CPU、磁盤、內存、IO等)是有限的,最終數據庫所能承載的數據量、數據處理能力都將遭遇瓶頸。
FreeSql 提供 AsTable 分表的基礎方法,GuidRepository 做爲分存式倉儲將實現了分表與分庫(不支持跨服務器分庫)的封裝。
var logRepository = fsql.GetGuidRepository<Log>(null, oldname => $"{oldname}_201903");
上面咱們獲得一個日誌倉儲按年月分表,使用它 CURD 最終會操做 Log_201903 表。
注意事項:
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);
期待更多發散。。。
var sql = fsql.Select<User>() .AsTable((a, b) => "(select * from tb_topic where clicks > 10)") .Page(1, 10).ToList()
(三十一)分區分表