【TcaplusDB知識庫】TcaplusDB全域性索引介紹

zmgogo 發表於 2021-11-22


索引說明

TcaplusDB支援兩種形式的索引:本地索引和全域性索引。

  • 本地索引:基於TcaplusDB主鍵欄位建立的索引,在建表時隨表一起建立。

  • 全域性索引:基於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與全域性索引之間的架構如下圖所示:

img

建立

建立或者修改全域性索引,需要在頁面上進行申請,進入oms頁面,點選 “業務管理” ---- > "表管理" ---- > 選擇要建立全域性索引的表,拉到最右側,如下圖:

img

點選 “索引”,進入到索引配置頁面,在該頁面勾上要建立索引的欄位,然後點選“確認建立索引”按鈕,這樣就生成了建立全域性索引的申請單,dba稽核之後,會生成一個建立全域性索引的事務,當事務執行成功後,該索引就可以被訪問了。

資料同步

資料同步,是指tcaplus資料同步到索引系統,兩者之間的資料是最終一致的,資料同步架構如下圖所示:

img

索引查詢

tcaplus提供sql查詢語句進行索引查詢,其中,sql查詢條件中的欄位必須是建立了全域性索引的欄位,另外,如果是聚合查詢,那麼聚合查詢的欄位也必須是建立了全域性索引的欄位;

一個索引查詢請求,當前限制最多返回3000條記錄;

支援的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 的查詢;

  • 不支援其他未提到的查詢。

索引查詢流程

img

索引使用方式

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

img

TcaplusDB是騰訊出品的分散式NoSQL資料庫,儲存和排程的程式碼完全自研。具備快取+落地融合架構、PB級儲存、毫秒級時延、無損水平擴充套件和複雜資料結構等特性。同時具備豐富的生態、便捷的遷移、極低的運維成本和五個九高可用等特點。客戶覆蓋遊戲、網際網路、政務、金融、製造和物聯網等領域。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69982264/viewspace-2843482/,如需轉載,請註明出處,否則將追究法律責任。