索引选择策略

表格存储作为海量结构化大数据存储,支持不同的索引结构,便于不同场景下进行查询分析加速使用。本文介绍在数据表上存在多元索引和二级索引时如何选择SQL查询所使用的索引。

说明

关于二级索引和多元索引的更多信息,请分别参见二级索引多元索引简介

使用数据表映射表

当数据表上存在二级索引和多元索引时,使用SQL查询会涉及到多个索引的选择,索引选择策略包括自动选择策略和手动选择策略。

重要

请确保已在数据表上创建映射关系。具体操作,请参见创建表的映射关系

自动选择策略

使用数据表的映射表查询数据时,表格存储会自动选择数据表、二级索引或多元索引进行数据查询。

重要
  • 如果创建表的映射关系时设置了执行的查询结果要满足强一致性或者不允许通过牺牲聚合操作的精度提升查询性能,则表格存储不会自动选择多元索引进行数据查询。

  • 当二级索引和多元索引同时包含SQL查询涉及的所有列时,表格存储会优先选择多元索引进行数据查询。

自动选择策略由上到下依次执行。具体执行流程如下:

  1. 自动选择多元索引:如果WHERE子句中的所有过滤列、聚合计算和排序涉及的列均包含在同一个多元索引中,则表格存储会自动选择该多元索引进行数据查询。

    例如SELECT A,B,C FROM sampletable WHERE A=XXX and D = YY;语句,如果A、B、C、D列均在sampletable表上的同一个多元索引中,则会自动选择到多元索引进行查询。

    此外,当Groupby、聚合函数等组合使用时,如果符合多元索引Search接口的统计聚合能力,则表格存储也会进行识别并下推算子,关于下推算子的更多信息,请参见计算下推

  2. 自动选择二级索引:如果二级索引能比数据表命中更多的WHERE子句中的主键条件(遵循最左匹配原则),且覆盖了SQL查询涉及的所有列,则表格存储会自动选择该二级索引进行数据查询。

    例如数据表主键为a、b,数据表上某个二级索引的主键为c、a、b,当查询条件为c = 1 and a > 1时,二级索引命中两个主键列,数据表命中一个主键列,则会自动选择到二级索引进行查询。

  3. 自动选择数据表或二级索引:根据SQL引擎内部的CBO逻辑从数据表或二级索引间进行选择,此时的选择结果与具体SQLPattern有关,SQL引擎会尽量选择代价较低的索引来执行查询。

手动选择策略

当要在查询数据时稳定地选择某一个索引时,您可以通过use index语法显式指定索引或者直接使用索引的映射表。

此处以数据表名为sampletable,多元索引名为sampletable_search_index,二级索引名为sampletable_secondary_index为例介绍手动选择策略的操作。

  • 显式指定访问数据表

    SQL语句中显式指定访问数据表。SQL示例如下:

    SELECT * FROM sampletable use index();
  • 显式指定访问多元索引或二级索引

    说明

    如果索引中不包含SQL查询相关的列,则SQL引擎会自动反查数据表以获取所需数据。

    SQL语句中显式指定要访问的索引。SQL示例如下:

    SELECT * FROM sampletable use index(sampletable_search_index); --显式访问多元索引
    SELECT * FROM sampletable use index(sampletable_secondary_index); --显式访问二级索引

使用二级索引映射表

当要通过指定的二级索引查询数据时,您可以直接使用二级索引映射关系进行查询。具体操作如下:

说明

使用索引映射表查询数据时,只能查询索引中包含的数据列。

  1. 使用CREATE TABLE语句创建二级索引表的映射关系。具体操作,请参见创建表的映射关系

  2. 使用SELECT语句通过二级索引映射表查询数据。具体操作,请参见查询数据

使用多元索引映射表

当要通过指定的多元索引查询数据时,您可以直接使用多元索引映射关系进行查询。具体操作如下:

说明

使用索引映射表查询数据时,只能查询索引中包含的数据列。

  1. 使用CREATE TABLE语句创建多元索引的映射关系。具体操作,请参见创建多元索引的映射关系

  2. 使用SELECT语句通过多元索引映射表查询数据。具体操作,请参见查询数据

附录:多元索引中功能与SQL表达式的映射

多元索引能够实现与SQL表达式相同的功能,具体功能映射信息请参见下表。

SQL表达式

示例

多元素引中功能

without predicate

不涉及

全匹配查询(MatchAllQuery)

=

  • a = 1

  • b = "hello world"

精确查询(TermQuery)

>

a > 1

范围查询(RangeQuery)

>=

a >= 2

<

a < 5

<=

a <= 10

is null

a is null

列存在性查询(ExistsQuery)

is not null

a is not null

and

a = 1 and b = "hello world"

多条件组合查询(BoolQuery)

or

a > 1 or b = 2

not

not a = 1

!=

a !=1

like

a like "%s%"

通配符查询(WildcardQuery)

in

a in (1,2,3)

多词精确查询(TermsQuery)

text_match

text_match(a, "tablestore cool")

匹配查询(MatchQuery)

text_match_phrase

text_match_phrase(a, "tablestore cool")

短语匹配查询(MatchPhraseQuery)

array_extract

array_extract(col_long)

数组和嵌套类型

nested_query

nested_query(`tags.tagName` = 'tag1' AND `tags.score` = 0.2)

order by

nested_query col_long

排序和翻页

limit

limit 10

min()

min(col_long)

统计聚合

max()

max(col_long)

sum()

sum(col_long)

avg()

avg(col_long)

count()

count(col_long)

count(distinct)

count(distinct col_long)

any_value()

any_value(col_long)

group by

group by col_long

相关文档

使用多元索引加速SQL查询数据时,您可以通过多元索引实现全文检索多元索引数组类型多元索引嵌套类型多元索引虚拟列等功能。