127
英雄聯盟
檢索數據__從 SQL 到 NoSQL_快速入門_表格存儲-阿裏雲
SQL
SQL SELECT 語句可以查詢關鍵列、非關鍵列或任意組合。WHERE 子句確定返回的行,如以下示例所示:
// 根據主鍵查詢一行
SELECT * FROM UserHistory
WHERE user_id = '10100' AND time_stamp = 1479265526;
// 查詢某個 user_id 下的所有數據
SELECT * FROM UserHistory
WHERE user_id = '10100';
// 根據某個 user_id 下的某段時間的所有記錄
SELECT * FROM UserHistory
WHERE user_id = '10100' AND time_stamp > 1478660726 AND time_stamp < 1479265526;
// 查詢某個 user_id 所有收藏的記錄
SELECT * FROM UserHistory
WHERE user_id = '10100' AND behavior_type = 'collect';
表格存儲
表格存儲中的數據查詢接口可以用類似的方式檢索數據,單行查詢 GetRow 和範圍查詢 GetRange 能夠提供對存儲數據物理位置的快速高效訪問,查詢的性能隻受到結果數據集大小的影響,不會受到表中數據總量大小的影響。
提供完整的主鍵信息,可以使用 GetRow 快速查詢這行數據,如下所示:
// SELECT * FROM UserHistory WHERE user_id = '10100' AND time_stamp = 1479265526;
// 設置主鍵信息
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn('user_id', PrimaryKeyValue.fromString("10100"));
primaryKeyBuilder.addPrimaryKeyColumn('time_stamp', PrimaryKeyValue.fromLong(1479265526));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// 讀一行
SingleRowQueryCriteria criteria = new SingleRowQueryCriteria(TABLE_NAME, primaryKey);
// 設置讀取最新版本
criteria.setMaxVersions(1);
GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
使用 GetRange 對某個 user_id 下所有的數據進行查詢,如下所示:
// 等同於 SELECT * FROM UserHistory WHERE user_id = '10100'
RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria(TABLE_NAME);
// 設置起始主鍵
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("user_id", PrimaryKeyValue.fromString("10100"));
primaryKeyBuilder.addPrimaryKeyColumn("time_stamp", PrimaryKeyValue.INF_MIN);
rangeRowQueryCriteria.setInclusiveStartPrimaryKey(primaryKeyBuilder.build());
// 設置結束主鍵
primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("user_id", PrimaryKeyValue.fromString("10100"));
primaryKeyBuilder.addPrimaryKeyColumn("time_stamp", PrimaryKeyValue.INF_MAX);
rangeRowQueryCriteria.setExclusiveEndPrimaryKey(primaryKeyBuilder.build());
// 設置讀取最新版本
rangeRowQueryCriteria.setMaxVersions(1);
// 默認讀取所有的屬性列
GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
請注意如下關鍵事項:
GetRange 需要指定所有主鍵的起始範圍,但每個主鍵的範圍並不是
AND
的關係,而是以第一個主鍵到最後一個主鍵為順序,優先比較前麵的主鍵,當前麵的主鍵在 GetRange 起止主鍵範圍內時,該條數據就會被讀取出來。比如兩個主鍵起止範圍為 (‘a’,5)~(‘c’,10),由於'a' < 'b' < 'c'
,所以主鍵為 (‘b’, 4) 的數據也符合要求。GetRange 支持
limit
及direction
來控製結果集行數和讀取的順序。為防止網絡延遲,GetRange 對返回結果集進行了限製,需要對 Response 中的 next_start_primary_key 進行判斷,為空時表示結果已經全部返回,不為空時需要繼續讀取。
GetRange 支持過濾器功能。
使用 GetRange 對某個 user_id 下某段時間範圍的所有的數據進行查詢,如下所示:
// SELECT * FROM UserHistory WHERE user_id = '10100' AND time_stamp >= 1478660726 AND time_stamp < 1479265526;
RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria(TABLE_NAME);
// 設置起始主鍵
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("user_id", PrimaryKeyValue.fromString("10100"));
primaryKeyBuilder.addPrimaryKeyColumn("time_stamp", PrimaryKeyValue.fromLong(1478660726));
rangeRowQueryCriteria.setInclusiveStartPrimaryKey(primaryKeyBuilder.build());
// 設置結束主鍵
primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("user_id", PrimaryKeyValue.fromString("10100"));
primaryKeyBuilder.addPrimaryKeyColumn("time_stamp", PrimaryKeyValue.fromLong(1479265526));
rangeRowQueryCriteria.setExclusiveEndPrimaryKey(primaryKeyBuilder.build());
// 設置讀取最新版本
rangeRowQueryCriteria.setMaxVersions(1);
// 默認讀取所有的屬性列
GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
該查詢等同於:
SELECT * FROM UserHistory
WHERE user_id = '10100' AND time_stamp > 1478660726 AND time_stamp < 1479265526;
如果需要繼續對屬性列做條件查詢,可以使用 過濾器功能, 如下查詢某個 user_id 下某所有的收藏記錄:
// SELECT * FROM UserHistory WHERE user_id = '10100' AND behavior_type = 'collect';
RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria(TABLE_NAME);
// 設置起始主鍵
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("user_id", PrimaryKeyValue.fromString("10100"));
primaryKeyBuilder.addPrimaryKeyColumn("time_stamp", PrimaryKeyValue.INF_MIN);
rangeRowQueryCriteria.setInclusiveStartPrimaryKey(primaryKeyBuilder.build());
// 設置結束主鍵
primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("user_id", PrimaryKeyValue.fromString("10100"));
primaryKeyBuilder.addPrimaryKeyColumn("time_stamp", PrimaryKeyValue.INF_MAX);
rangeRowQueryCriteria.setExclusiveEndPrimaryKey(primaryKeyBuilder.build());
// 設置屬性列的過濾條件: behavior_type = 'collect'
SingleColumnValueFilter filter = new SingleColumnValueFilter("behavior_type", SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromString("collect"));
// 表格存儲是 schemafree 模型,有些行不包括屬性列 behavior_type
// 設置為 false 表示如果該行沒有屬性列 behavior_type,則不滿足條件條件
filter.setPassIfMissing(false);
rangeRowQueryCriteria.setFilter(filter);
// 設置讀取最新版本
rangeRowQueryCriteria.setMaxVersions(1);
// 默認讀取所有的屬性列
GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
該查詢等同於:
SELECT * FROM UserHistory
WHERE user_id = '10100' AND behavior_type = 'collect';
當然,也可以通過如下方式來實現:
// SELECT * FROM UserHistory WHERE user_id = '10100' AND behavior_type = 'collect';
RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria(TABLE_NAME);
// 設置起始主鍵
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("user_id", PrimaryKeyValue.INF_MIN);
primaryKeyBuilder.addPrimaryKeyColumn("time_stamp", PrimaryKeyValue.INF_MIN);
rangeRowQueryCriteria.setInclusiveStartPrimaryKey(primaryKeyBuilder.build());
// 設置結束主鍵
primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("user_id", PrimaryKeyValue.INF_MAX);
primaryKeyBuilder.addPrimaryKeyColumn("time_stamp", PrimaryKeyValue.INF_MAX);
rangeRowQueryCriteria.setExclusiveEndPrimaryKey(primaryKeyBuilder.build());
// 設置數據過濾條件:user_id='10100' 並且 behavior_type = 'collect'
SingleColumnValueFilter filter1 = new SingleColumnValueFilter("user_id", SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromString("10100"));
SingleColumnValueFilter filter2 = new SingleColumnValueFilter("behavior_type", SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromString("collect"));
CompositeColumnValueFilter filter = new CompositeColumnValueFilter(CompositeColumnValueFilter.LogicOperator.AND);
filter.addFilter(filter1);
filter.addFilter(filter2);
rangeRowQueryCriteria.setFilter(filter);
該實現對整張表進行了掃描,並找出
user_id='10100' AND behavior_type='collect'
的記錄,但是由於是全表掃描,其效率會遠遠低於基於特定主鍵範圍的查詢。請注意如下關鍵事項:
過濾器 Filter 最多可以支持 10 個條件組合,可以用於 GetRow、BatchGetRow 和 GetRange 接口中。
過濾器 Filter 是對 GetRange 的數據在服務端進行過濾,並不會減少磁盤的 IO 次數,但是能夠有效降低網絡傳輸流量。
良好的主鍵設計能夠大大提高範圍查詢的效率。
最後更新:2016-11-29 13:48:46
上一篇:
寫入數據__從 SQL 到 NoSQL_快速入門_表格存儲-阿裏雲
下一篇:
更新數據__從 SQL 到 NoSQL_快速入門_表格存儲-阿裏雲
服務連接__基本概念_基本介紹_大數據計算服務-阿裏雲
Web端直傳實踐簡介__Web端直傳實踐_最佳實踐_對象存儲 OSS-阿裏雲
如何激活代金券?___代金券_代金券及推薦碼_財務-阿裏雲
推送去重設備統計__API列表_OpenAPI 1.0_移動推送-阿裏雲
2016年10月12日安全管家控製台發布__產品升級更新_安全管家服務-阿裏雲
產品概述__產品簡介_消息服務-阿裏雲
ALIYUN::ECS::SecurityGroup__資源列表_資源編排-阿裏雲
原備案在阿裏雲新增網站圖文引導__流程引導圖_備案流程_備案-阿裏雲
查詢錄製索引文件__直播流操作接口_API 手冊_CDN-阿裏雲
雲服務器 ECS 登錄 Windows 實例
相關內容
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲