【TcaplusDB知識庫】TcaplusDB本地索引介紹

zmgogo 發表於 2021-11-22


索引說明

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是沒有限制記錄數個數的。


img

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


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