1

次のようにTABLEとインデックスを作成しました

CREATE TABLE refresh_token (
    user_id bigint,
    refresh_token テキスト、
    access_token テキスト、
    device_desc テキスト、
    device_type テキスト、
    expire_time タイムスタンプ、
    org_id bigint、
    PRIMARY KEY (user_id、refresh_token)
) WITH CLUSTERING ORDER BY (refresh_token ASC)
CREATE INDEX i_access_token ON demodb.refresh_token (access_token);

何百万回もデータを挿入または削除した後、次のクエリでデータを返すことができないことがわかりました。実際、データにはこの行があります。

PRIMARY KEYでクエリすると

select * from refresh_token where user_id=405198 and refresh_token='E82B57D9D64BECDBD6B5602A72816BD19016323504F803116F66A32598E04298';

データを返します:

select * from refresh_token where user_id=405198 and refresh_token='E82B57D9D64BECDBD6B5602A72816BD19016323504F803116F66A32598E04298';

 ユーザー ID | リフレッシュトークン | アクセストークン | device_desc | デバイスタイプ | 有効期限 | org_id
------+-------------------------------------------- --------------------------+-------------------------------------- -------------------------------------------+------ -------+-------------+--------------------------+- -------------
  405198 | E82B57D9D64BECDBD6B5602A72816BD19016323504F803116F66A32598E04298 | E82B57D9D64BECDB16D4F3F9F81AC0EF7AF2C4B460CB0F33C9CEFA5846BA7BE1 | null | null | null | null | 2016-06-07 14:09:52+0800 | 481036337156

しかし、セカンダリ インデックスでクエリを実行すると、null が返されます。

select * from refresh_token where access_token ='E82B57D9D64BECDB16D4F3F9F81AC0EF7AF2C4B460CB0F33C9CEFA5846BA7BE1';

 ユーザー ID | リフレッシュトークン | アクセストークン | device_desc | デバイスタイプ | 有効期限 | org_id
------+---------------+--------------+--------- --+-------------+-------------+--------

ありがとう

4

1 に答える 1

1

セカンダリ インデックスは、カーディナリティの低いフィールドに対してのみ推奨されます。あなたの access_token フィールドは、カーディナリティが非常に高いように見えます (100 万行すべてで一意である場合もあります)。これは、Cassandra の既知のアンチ パターンです。

カーディナリティの高いフィールドは、既知の場所にハッシュされるため、パーティション キーなどに適しています。ただし、セカンダリ インデックスはハッシュされず、各ノードのローカル データ構造を介して検出されます。これらのローカル データ構造は、多数の異なる値がインデックス化されている場合、扱いにくく非効率的になります。一致する access_token を持つノードが干し草の山で針を見つける前に、内部タイムアウトに達していると思われます。

access_token でデータを検索する必要がある場合は、access_token がパーティション キーである 2 つ目のテーブルを作成し、それを使用して対応する user_id と refresh_token を検索することをお勧めします。そうすれば、access_token をハッシュとして使用し、信頼性の高い迅速なルックアップを取得できます。

于 2015-06-18T00:26:14.760 に答える