【TcaplusDB知識庫】什麼是TcaplusDB資料庫?
TcaplusDB與MongoDB術語對比
SQL術語/概念 | MongoDB術語/概念 | TcaplusDB術語/概念 | 解釋/說明 |
---|---|---|---|
database | database | cluster | 資料庫 |
table | collection | tablegroup/table | 資料庫表/集合 |
row | document | record | 資料記錄行/文件 |
column | field | field | 資料欄位/域 |
index | index | index | 索引 |
primary key | primary key | primary key | "主鍵,MongoDB自動將_id欄位設定為主鍵" |
表
TcaplusDB表由主鍵欄位和非主鍵欄位兩部分組成,主鍵欄位最多可以指定8個,普通欄位(非普通欄位)最多可以指定256個。
按照表定義可分為Protobuf表和TDR表,按照表結構可以分為Generic表和List表。
分表因子
Tcaplus的表定義要求設定一個分表因子(splittablekey)屬性,分表因子必須是主鍵欄位(primarykey)的子集。本質上,splittablekey所包含的欄位將參與hash計算,然後根據hash值決定該記錄被儲存至叢集中的哪個節點。因此,一個表的多個記錄,它們splittablekey欄位的值應該是多樣化的,這樣資料分佈才比較均衡。舉例來說,假設一個表的primarykey是"uid,role_id,zone_id",其中uid和role_id的值足夠多樣,而zone_id只有幾個、最多幾百個不同的值,那麼使用zone_id作為splittablekey將會有很大的風險,若某個特定zone_id對應的記錄特別多,會導致Tcaplus特定的儲存節點嚴重過載,甚至資料量超過機器儲存容量而無法提供服務。假設一個表的分表因子是性別,這會導致資料最多分佈到2個儲存節點, 那麼業務的分散式能力就會被限制到最多2個儲存節點的效能上。
分表因子決定了資料的物理分佈(系統根據該欄位做hash分散到不同節點),建議取離散度高的欄位,利於負載均衡。不指定時預設取primarykey的所有欄位。
記錄
TcaplusDB記錄由一行字串組成每個欄位的數字都支援巢狀型別,巢狀最多32層。單個記錄大小最高10MB,可以將常用的物件檔案序列化成二進位制檔案儲存。
索引
TcaplusDB支援兩種形式的索引:本地索引和全域性索引。
-
本地索引:基於TcaplusDB主鍵欄位建立的索引,在建表時隨表一起建立。
-
全域性索引:基於TcaplusDB表一級欄位(包括主鍵欄位和非主鍵欄位)建立的索引。
通過本地索引和全域性索引,使用者可方便利用索引進行資料查詢。優勢:
-
基於本地索引查詢,可以滿足使用者通過部分主鍵欄位進行索引查詢
-
基於全域性索引,可以滿足使用者通過任意一級欄位進行多種形式查詢,如範圍、模糊、聚合、分頁等。
本地索引
基於TcaplusDB主鍵欄位建立的索引,在建表時隨表一起建立。
建立
本地索引是在建立表的時候,在表定義中申明的,比如proto或者xml檔案中。並且一旦表建立後,就不能再增加、修改和刪除本地索引了,刪除表的時候,本地索引會一併刪除。
查詢
本地索引只支援等值查詢,也就說,使用本地索引查詢時,需要將本地索引中定義的欄位全部都給值,比如定義了本地索引,包含欄位為key1, key2,那麼使用該索引進行查詢時,就必須把key1和key2的值給出來才可以,並且是key1=XXX and key2=XXX的方式進行查詢;
在tcaplus中,對應的是GetByPartKey請求,只有該請求是利用本地索引進行查詢的;
由於本地索引查詢時,可能會返回非常多的資料,此時,tcaplus會進行分包返回的,如果業務側收包速度低於tcaplus返回響應包的速度,那麼就可能導致tcaplus出現因為網路快取區滿而丟包的情況,一般建議是使用本地索引查詢時,利用limit和offset的方式來分多次請求資料,特別是當資料量很大時。
特點
-
本地索引是實時索引,當插入或者刪除資料時,會同時更新索引資料;
-
本地索引的欄位必須包含在主鍵欄位中,並且欄位中還必須包含分表因子,因此,查詢時最終只會落到一個資料分片上進行查詢;
-
本地索引只支援等值查詢;
-
一個表可以建立多個本地索引,查詢時必須包含某一個本地索引的全部欄位;
-
目前只有generic表支援本地索引;
約束
-
本地索引一旦建立,無法在使用期間修改、刪除、新增,隨表刪除而刪除。
-
本地索引只支援精確匹配,即在用本地索引欄位作為查詢條件時,只能精確匹配到具體值,不支援模糊、範圍匹配。
-
本地索引必須包含分片因子。
-
本地索引中的欄位都必須屬於主鍵欄位。
-
對其它非主鍵欄位建立本地索引也是不允許的。
注意事項
假設本地索引包含的欄位為key1, key2,如果出現key1=XXX and key2=XXX的記錄數非常多時,當進行這個條件的本地索引查詢時,就很容易出現效能問題,需要儘量避免,當然,目前tcaplus是沒有限制記錄數個數的。
全域性索引
全域性索引是基於TcaplusDB表一級欄位(包括主鍵欄位和非主鍵欄位)建立的索引,顧名思義,就是tcaplus與索引系統之間是相互獨立的,通過非同步同步的方式,將tcaplus中的資料同步到索引系統,因此,全域性索引是一個準實時索引系統,即進行索引查詢時,tcaplus表中新更新的資料無法實時查詢出來,正常情況下,新更新的資料到能夠通過索引查詢出來的時延為秒級,大部分情況是1秒之內;
全域性索引目前只支援對generic表建立索引,並且只支援表的一級欄位(包括key欄位和value欄位)建立索引;並且也只支援簡單型別建立索引,支援的型別包括:int8, uint8, int16, uint16, int32, uint32, int64, uint64, float, double, string(字串); 對於pb表的bool和enum型別也支援,當pb表欄位定義為string型別,如果該欄位儲存的是二進位制,那麼查詢結果可能會不符合預期;對於uint64型別,如果值大於int64的最大值,查詢結果將不符合預期,因此,如果該欄位值會超過int64的最大值,建議不要為該欄位建立索引;
tcaplus支援動態建立和修改索引,業務可以隨時增加或刪除或者修改全域性索引,修改全域性索引時,比如增加了一個索引欄位,不會影響業務對修改前的全域性索引查詢;
tcaplus與全域性索引之間的架構如下圖所示:
建立
建立或者修改全域性索引,需要在頁面上進行申請,進入oms頁面,點選 “業務管理” ---- > "表管理" ---- > 選擇要建立全域性索引的表,拉到最右側,如下圖:
點選 “索引”,進入到索引配置頁面,在該頁面勾上要建立索引的欄位,然後點選“確認建立索引”按鈕,這樣就生成了建立全域性索引的申請單,dba稽核之後,會生成一個建立全域性索引的事務,當事務執行成功後,該索引就可以被訪問了。
資料同步
資料同步,是指tcaplus資料同步到索引系統,兩者之間的資料是最終一致的,資料同步架構如下圖所示:
查詢
tcaplus提供sql查詢語句進行索引查詢,其中,sql查詢條件中的欄位必須是建立了全域性索引的欄位,另外,如果是聚合查詢,那麼聚合查詢的欄位也必須是建立了全域性索引的欄位;
一個索引查詢請求,當前限制最多返回3000條記錄;
索引使用方式
-
tcaplus_client客戶端工具
tcaplus_client工具支援全域性索引查詢,查詢命令直接使用sql查詢語句進行查詢即可,使用help select 命令可以獲取相關查詢命令。注意tcaplusdb_client使用版本,目前最新的支援3.46.0。
-
C++ SDK
C++ SDK 已整合相關全域性索引API,在示例程式碼中也有相關實現,具體請參考:
C++ TDR SDK 全域性二索引示例路徑
TcaplusServiceApiXXX/release/x86_64/examples/tcaplus/C++_tdr1.0_syncmode_generic_simpletable/SingleOperation/globle_index_query
C++ PB SDK全域性索引示例路徑
TcaplusPbApiXXX/release/x86_64/examples/tcaplus/C++_pb2_coroutine_simpletable/SingleOperation/global_index_query
支援的sql語句
-
條件查詢
支援 =, >, >=, <, <=, !=, between, in, not in, like, not like, and, or , 比如:
select * from table where a > 100 and b < 1000 ;
select * from table where a between 1 and 100 and b < 1000 ;
select * from table where str like "test" ;
select * from table where a > 100 or b < 1000 ;
注意:between查詢時,between a and b,對應的查詢範圍為[a, b],比如 between 1 and 100, 是會包含1和100這兩個值的,即查詢範圍為[1,100]
注意:like查詢是支援模糊匹配,其中"%"萬用字元,匹配0個或者多個字元; “_”萬用字元,匹配1個字元;
-
分頁查詢
支援limit offset分頁查詢,比如:
select * from table whre a > 100 limit 100 offset 0;
注意:當前limit必須與offset搭配使用,即不支援limit 1 或者 limit 0,1這種;
-
聚合查詢
當前支援的聚合查詢包括:sum, count, max, min, avg,比如:
select sum(a), count(*), max(a), min(a), avg(a) from table where a > 1000;
注意:聚合查詢不支援limit offset,即limit offset 不生效;
注意:目前只有count支援distinct,即 select count(distinct(a)) from table where a > 1000; 其他情況均不支援distinct
-
部分欄位查詢
支援查詢部分欄位的值,比如:
select a, b from table where a > 1000;
對於pb表,還支援查詢巢狀欄位的值,類似:
select field1.field2.field3, a, b from table where a > 1000;
不支援的sql查詢語句
-
不支援聚合查詢與非聚合查詢混用
select * , a , b from table where a > 1000 ;
select sum (a ) , a , b from table where a > 1000 ;
select count ( * ) , * from table where a > 1000 ;
-
不支援order by查詢
select * from table where a > 1000 order by a;
-
不支援group by查詢
select * from table where a > 1000 group by a;
-
不支援having查詢
select sum(a) from table where a > 1000 group by a having sum(a) > 10000;
-
不支援多表聯合查詢
select * from table1 where table1.a > 1000 and table1.a = table2.b;
-
不支援巢狀select查詢
select * from table where a > 1000 and b in (select b from table where b < 5000);
-
不支援別名
select sum(a) as sum_a from table where a > 1000;
-
不支援的其他查詢
-
不支援join查詢;
-
不支援union查詢;
-
不支援類似 select a+b from table where a > 1000 的查詢;
-
不支援類似 select * from table where a+b > 1000 的查詢;
-
不支援類似 select * from table where a >= b 的查詢;
-
不支援其他未提到的查詢。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69982264/viewspace-2843480/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【TcaplusDB知識庫】TcaplusDB本地索引介紹索引
- 【TcaplusDB知識庫】TcaplusDB全域性索引介紹索引
- [TcaplusDB知識庫]TcaplusDB客戶端及常用命令客戶端
- [TcaplusDB知識庫]資料庫支撐底盤引擎計算層介紹資料庫
- 【TcaplusDB知識庫】PB表 C++ 示例程式碼-更新資料C++
- 【TcaplusDB知識庫】預設Schema表型別介紹型別
- 【TcaplusDB知識庫】如何對陣列進行操作陣列
- 【TcaplusDB知識庫】PB表 C++ 示例程式碼-讀取資料C++
- 【TcaplusDB知識庫】PB表C++示例程式碼-刪除資料C++
- 【TcaplusDB知識庫】條件過濾說明與更新
- 玩轉騰訊資料庫TcaplusDB|期待下次與你相見!資料庫
- 什麼是資料庫?什麼是雲資料庫?資料庫
- 騰訊雲遊戲資料庫 TcaplusDB 的一些常見問題的解答遊戲資料庫
- 什麼是皇帝資料庫?資料庫
- 什麼是Cassandra資料庫資料庫
- 什麼是NoSQL資料庫?SQL資料庫
- Chronicles 是什麼資料庫資料庫
- 【資料庫】雲資料庫rds是什麼意思?有什麼優勢?資料庫
- 資料是什麼——資料的倉庫
- 什麼是資料庫檢視?資料庫
- 【Web安全小知識】什麼是撞庫攻擊?如何預防撞庫?Web
- 雲資料庫RDS是什麼?雲資料庫RDS有什麼優勢?資料庫
- 知識分享--資料庫資料庫
- MySQL資料庫知識MySql資料庫
- MySQL資料庫是什麼?linux資料庫運維MySql資料庫Linux運維
- 知識庫終極指南:為什麼您的企業需要知識庫?
- 資料庫:外來鍵是什麼資料庫
- 什麼是真正的自治資料庫?資料庫
- 資料庫裡存放的是什麼?資料庫
- 什麼是知識
- 資料庫倉庫系列:(一)什麼是資料倉儲,為什麼要資料倉儲資料庫
- MySQL資料庫基本知識MySql資料庫
- Java 資料庫知識整理Java資料庫
- 資料庫理論知識資料庫
- 資料庫基礎知識資料庫
- 資料庫mysql儲存是什麼?可以存什麼?資料庫MySql
- 資料庫審計是什麼意思?作用是什麼?資料庫
- flask資料庫遷移是什麼意思Flask資料庫