
# 基于全局二级索引查询HBase表数据
#### 功能简介
添加了全局二级索引的用户表，在使用索引条件进行查询时，可以转换为对索引表的范围查询，性能高于针对无二级索引用户表的数据查询。
#### 代码样例
以下代码片段在com.huawei.bigdata.hbase.examples包的"GlobalSecondaryIndexSample"类中。
本样例用于查询指定**id** 对应的**id** 、**age** 、**name** 信息，并命中**idx_id_age**索引，由于查询结果被完全覆盖，且无需回原表查询，能够达到最优的查询性能。
```
/**
    * Scan data by secondary index.
    */
public void testScanDataByIndex() {
    LOG.info("Entering testScanDataByIndex.");
    Scan scan = new Scan();
    // Create a filter for indexed column.
    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("info"), Bytes.toBytes("id"),
        CompareOperator.EQUAL, Bytes.toBytes("3"));
    filter.setFilterIfMissing(true);
    scan.setFilter(filter);
    // Specify returned columns
    // If returned columns not included in index table, will query back user table,
    // it's not the fast way to get data, suggest to cover all needed columns.
    // If you want to confirm whether using index for scanning, please set hbase client log level to DEBUG.
    scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("id"));
    scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("age"));
    scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"));
    LOG.info("Scan indexed data.");
    try (Table table = conn.getTable(tableName); ResultScanner scanner = table.getScanner(scan)) {
        for (Result result : scanner) {
            for (Cell cell : result.rawCells()) {
                LOG.info("{}:{},{},{}", Bytes.toString(CellUtil.cloneRow(cell)),
                    Bytes.toString(CellUtil.cloneFamily(cell)), Bytes.toString(CellUtil.cloneQualifier(cell)),
                    Bytes.toString(CellUtil.cloneValue(cell)));
            }
        }
        LOG.info("Scan data by index successfully.");
    } catch (IOException e) {
        LOG.error("Scan data by index failed ", e);
    }
    LOG.info("Exiting testScanDataByIndex.");
}
```
