【TcaplusDB知識庫】TcaplusDB本地索引介紹
TcaplusDB支援兩種形式的索引:本地索引和全域性索引。
-
本地索引:基於TcaplusDB主鍵欄位建立的索引,在建表時隨表一起建立。
-
全域性索引:基於TcaplusDB表一級欄位(包括主鍵欄位和非主鍵欄位)建立的索引。
通過本地索引和全域性索引,使用者可方便利用索引進行資料查詢。優勢:
-
基於本地索引查詢,可以滿足使用者通過部分主鍵欄位進行索引查詢
-
基於全域性索引,可以滿足使用者通過任意一級欄位進行多種形式查詢,如範圍、模糊、聚合、分頁等。
使用限制
本地索引使用限制
-
本地索引一旦建立,無法在使用期間修改、刪除、新增,隨表刪除而刪除。
-
本地索引只支援精確匹配,即在用本地索引欄位作為查詢條件時,只能精確匹配到具體值,不支援模糊、範圍匹配。
全域性索引使用限制
-
全域性索引只支援表一級欄位,對於那些巢狀欄位、陣列列表型別欄位不支援建立全域性索引。
-
全域性索引只支援Generic型別表,對於List型別表不支援。
-
全域性索引目前支援在tcaplus_client工具、C++ SDK(TDR協議表&PB協議表)、JDBC 以及GO API中使用。
-
全域性索引有部分SQL不支援,請參考本文末關於不支援SQL的描述
本地索引
特點
-
本地索引是實時索引,當插入或者刪除資料時,會同時更新索引資料;
-
本地索引的欄位必須包含在主鍵欄位中,並且欄位中還必須包含分片欄位,因此,查詢時最終只會落到一個資料分片上進行查詢;
-
本地索引只支援等值查詢;
-
一個表可以建立多個本地索引,查詢時必須包含某一個本地索引的全部欄位;
-
目前只有generic表支援本地索引;
建立
本地索引是在建立表的時候,在表定義中申明的,並且一旦表建立後,就不能再增加、修改和刪除本地索引了,刪除表的時候,本地索引會一併刪除;
tdr表定義本地索引
示例如下:
<?xml version="1.0" encoding="GBK" standalone="yes" ?>
< metalib name= "tcaplus_tb" tagsetversion= "1" version= "1" >
< struct name= "PLAYERONLINECNT" version= "1" primarykey= "TimeStamp,GameSvrID,GameAppID" splittablekey= "TimeStamp" >
< entry name= "TimeStamp" type= "uint32" desc= "單位為分鐘" />
< entry name= "GameSvrID" type= "string" size= "64" />
< entry name= "GameAppID" type= "string" size= "64" desc= "gameapp id" />
< entry name= "OnlineCntIOS" type= "uint32" defaultvalue= "0" desc= "ios線上人數" />
< entry name= "OnlineCntAndroid" type= "uint32" defaultvalue= "0" desc= "android線上人數" />
< entry name= "BinaryLen" type= "smalluint" defaultvalue= "1" desc= "資料來源資料長度;長度為0時,忽略來源檢查" />
< entry name= "binary" type= "tinyint" desc= "二進位制" count= "1000" refer= "BinaryLen" />
< entry name= "binary2" type= "tinyint" desc= "二進位制2" count= "1000" refer= "BinaryLen" />
< entry name= "strstr" type= "string" size= "64" desc= "字串" />
< index name= "index_1" column= "TimeStamp" />
< index name= "index_2" column= "TimeStamp, GameSvrID" />
< index name= "index_3" column= "TimeStamp, GameAppID" />
</ struct >
</ metalib >
其中,index的那幾項就是定義的本地索引,上面表中定義了3個本地索引(index_1, index_2, index_3),索引的名字可以任意的字串,column是該索引所包含的欄位,多個欄位之間通過逗號隔開。 索引約束:
-
本地索引必須包含分片因子, 如上所示TimeStamp欄位必須包含在每個主鍵索引中;
-
本地索引中的欄位都必須屬於主鍵欄位,因此,對GameSvrID和GameAppID建立索引是不允許的;
-
對其它非主鍵欄位建立本地索引也是不允許的。
pb表定義本地索引
示例如下:
syntax = "proto3"; // Specify the version of the protocol buffers language
import "tcaplusservice.optionv1.proto"; // Use the public definitions of TcaplusDB by importing them.
message game_players { // Define a TcaplusDB table with message
// Specify the primary keys with the option tcaplusservice.tcaplus_primary_key
// The primary key of a TcaplusDB table has a limit of 4 fields
option( tcaplusservice. tcaplus_primary_key) = "player_id, player_name, player_email";
// Specify the primary key indexes with the option tcaplusservice.tcaplus_index
option( tcaplusservice. tcaplus_index) = "index_1(player_id, player_name)";
option( tcaplusservice. tcaplus_index) = "index_2(player_id, player_email)";
// Value Types supported by TcaplusDB
// int32, int64, uint32, uint64, sint32, sint64, bool, fixed64, sfixed64, double, fixed32, sfixed32, float, string, bytes
// Nested Types Message
// primary key fields
int64 player_id = 1;
string player_name = 2;
string player_email = 3;
// Ordinary fields
int32 game_server_id = 4;
repeated string login_timestamp = 5;
repeated string logout_timestamp = 6;
bool is_online = 7;
payment pay = 8;
}
message payment {
int64 pay_id = 1;
uint64 amount = 2;
int64 method = 3;
}
其中, option(tcaplusservice.tcaplus_index) 就是本地索引的定義方式,index_1(player_id, player_name)中的index_1是索引名,player_id和player_name是索引欄位;
查詢
本地索引只支援等值查詢,也就說,使用本地索引查詢時,需要將本地索引中定義的欄位全部都給值,比如定義了本地索引,包含欄位為key1, key2,那麼使用該索引進行查詢時,就必須把key1和key2的值給出來才可以,並且是key1=XXX and key2=XXX的方式進行查詢;
在tcaplus中,對應的是GetByPartKey請求,只有該請求是利用本地索引進行查詢的;
由於本地索引查詢時,可能會返回非常多的資料,此時,tcaplus會進行分包返回的,如果業務側收包速度低於tcaplus返回響應包的速度,那麼就可能導致tcaplus出現因為網路快取區滿而丟包的情況,一般建議是使用本地索引查詢時,利用limit和offset的方式來分多次請求資料,特別是當資料量很大時;
注意事項
假設本地索引包含的欄位為key1, key2,如果出現key1=XXX and key2=XXX的記錄數非常多時,當進行這個條件的本地索引查詢時,就很容易出現效能問題,需要儘量避免,當然,目前tcaplus是沒有限制記錄數個數的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69982264/viewspace-2843481/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【TcaplusDB知識庫】TcaplusDB全域性索引介紹索引
- 【TcaplusDB知識庫】預設Schema表型別介紹型別
- 【TcaplusDB知識庫】什麼是TcaplusDB資料庫?資料庫
- [TcaplusDB知識庫]TcaplusDB客戶端及常用命令客戶端
- [TcaplusDB知識庫]資料庫支撐底盤引擎計算層介紹資料庫
- 【TcaplusDB知識庫】如何對陣列進行操作陣列
- 【TcaplusDB知識庫】條件過濾說明與更新
- 【TcaplusDB知識庫】PB表 C++ 示例程式碼-更新資料C++
- 【TcaplusDB知識庫】PB表 C++ 示例程式碼-讀取資料C++
- 【TcaplusDB知識庫】PB表C++示例程式碼-刪除資料C++
- 資料庫安全知識介紹資料庫
- 資料庫基礎知識介紹!資料庫
- 資料庫開發必備知識介紹資料庫
- 玩轉騰訊資料庫TcaplusDB|期待下次與你相見!資料庫
- TcaplusDB君 · 行業新聞彙編(一)行業
- TcaplusDB君 · 行業新聞彙編(二)行業
- TcaplusDB君 · 行業新聞彙編(三)行業
- 模型程式碼理解本地知識庫模型
- 本地部署AI問答知識庫AI
- MySQL索引介紹MySql索引
- 區塊鏈入門知識介紹!區塊鏈
- C# 基礎知識系列- 13 常見類庫介紹(一)C#
- TcaplusDB君 · 行業新聞彙編(9月10號)行業
- TcaplusDB君 · 行業新聞彙編(9月7日)行業
- TcaplusDB君 · 行業新聞彙編(9月13號)行業
- TcaplusDB君 · 行業新聞彙編(9月3號)行業
- TcaplusDB君 · 行業新聞彙編(9月8號)行業
- 今天TcaplusDB想對所有的老師說:您辛苦了!
- TcaplusDB君 · 行業新聞彙編(10月2號)行業
- 資料庫介紹--初識資料庫資料庫
- 【INDEX】Postgresql索引介紹IndexSQL索引
- 騰訊雲遊戲資料庫 TcaplusDB 的一些常見問題的解答遊戲資料庫
- Java知識點總結(註解-介紹)Java
- Java基礎知識篇——Java基本介紹Java
- 關於mysql基礎知識的介紹MySql
- 知識圖譜技術的新成果—KGB知識圖譜介紹
- MySQL 索引知識大全MySql索引
- ES 文件與索引介紹索引