使用SQL查询数据时如何选择查询方式

更新时间:
复制为 MD 格式

使用 SQL 查询数据时,可以通过数据表的映射表或多元索引的映射表查询数据,具体选择取决于对数据一致性和聚合精度的要求。

表格存储如何路由 SQL 查询

表格存储支持多种索引结构,适用于不同的查询和分析场景:

  • 主键:数据表内置索引,支持单行读取(GetRow)和范围读取(GetRange)

  • 二级索引表:自定义主键列的索引表

  • 多元索引:基于倒排索引和时空索引,支持全文检索、多维查询等高级查询能力

SQL 查询功能支持通过数据表的映射表或多元索引的映射表查询数据。使用数据表的映射表时,表格存储会根据配置自动选择是否使用多元索引执行查询。详情请参见索引选择策略

样例场景

以下示例使用名为 exampletable 的数据表,包含以下列:

列名

类型

角色

id

整型

主键列

name

字符串类型

属性列

context

字符串类型

属性列

该数据表已创建名为 exampletable_searchindex 的多元索引,索引包含 id(整型)和 context(文本类型)两列。

关键事实name 列不在多元索引中。这决定了表格存储何时会回退到数据表执行查询。

根据需求选择查询方式:

使用数据表的映射表

创建数据表的映射表时,以下两个参数决定查询行为:

参数

可选值

作用

data_consistency

eventual(默认)/ strong

控制查询结果是否反映最新写入数据

allow_inaccurate_aggregation

true(默认)/ false

控制是否允许表格存储将聚合查询路由到多元索引(多元索引的聚合结果可能为近似值)

这两个参数的组合决定了以下三种方式的适用场景。

说明

关于创建数据表映射表的详细操作,请参见创建表的映射关系

方式一:最终一致,允许聚合近似(默认行为)

适用于对数据时效性要求不高、可以接受聚合近似结果的查询场景。表格存储会在 SELECT 列表中的所有列均被多元索引覆盖时,自动路由到多元索引执行查询,从而提升查询性能。

自动索引选择规则:表格存储检查 SELECT 列表中的所有列是否均包含在某个多元索引中。

  • 若所有列均被覆盖,则路由到多元索引执行查询。

  • 若有任意列不在索引中,则回退到数据表执行查询。

    1. 为数据表创建映射表,映射表名称为 exampletable,其他参数保持默认。

      CREATE TABLE `exampletable` (`id` BIGINT, `name` MEDIUMTEXT, `context` MEDIUMTEXT, PRIMARY KEY(id)) ENGINE='Tablestore';
    2. 查询数据。

      以下语句查询所有列(*)。由于 name 列不在 exampletable_searchindex 中,多元索引无法覆盖完整查询,表格存储回退到数据表执行查询。

      SELECT * FROM exampletable LIMIT 10;

      以下语句仅查询 idcontext 两列,两列均在 exampletable_searchindex 中,表格存储路由到多元索引执行查询。

      SELECT id,context FROM exampletable LIMIT 10;

方式二:强一致性读

适用于查询结果必须反映最新写入数据的场景。由于多元索引采用最终一致性,无法保证强一致性,在此模式下表格存储不会通过任何多元索引执行查询。

  1. 为数据表创建映射表,映射表名称为 exampletable,并将 data_consistency 设置为 strong

    CREATE TABLE `exampletable` (`id` BIGINT, `name` MEDIUMTEXT, `context` MEDIUMTEXT, PRIMARY KEY(id)) ENGINE='Tablestore', ENGINE_ATTRIBUTE='{"data_consistency": "strong"}';
  2. 查询数据。更多信息,请参见查询数据

    多元索引采用最终一致性,无法保证强一致性,因此表格存储不会通过任何多元索引执行查询。

方式三:最终一致,要求聚合精确

适用于需要最终一致性但要求聚合结果精确的场景。由于多元索引的聚合操作可能返回近似值,在此模式下表格存储不会通过任何多元索引执行查询。

  1. 为数据表创建映射表,映射表名称为 exampletable,将 data_consistency 设置为 eventual,并将 allow_inaccurate_aggregation 设置为 false

    CREATE TABLE `exampletable` (`id` BIGINT, `name` MEDIUMTEXT, `context` MEDIUMTEXT, PRIMARY KEY(id)) ENGINE='Tablestore', ENGINE_ATTRIBUTE='{"data_consistency": "eventual", "allow_inaccurate_aggregation": false}';
  2. 查询数据。更多信息,请参见查询数据

    多元索引的聚合操作可能返回近似值,因此表格存储不会通过任何多元索引执行查询。

使用多元索引的映射表

若需要使用全文检索等多元索引特有能力(例如对文本类型列使用 text_match 函数),可直接为指定多元索引创建映射表。通过这种方式执行的查询始终使用该多元索引,不受列覆盖范围限制。

说明

关于创建多元索引映射表的详细操作,请参见创建多元索引的映射关系

  1. 为多元索引创建映射表,映射表名称为 exampletable_searchindex_test

    CREATE TABLE `exampletable_searchindex_test` (`id` BIGINT, `context` MEDIUMTEXT) ENGINE='searchindex' ENGINE_ATTRIBUTE='{"index_name": "exampletable_searchindex", "table_name": "exampletable"}'
  2. 查询数据。以下示例使用 text_match 函数对 context 列执行全文检索。

    SELECT id,context FROM exampletable_searchindex_test WHERE text_match(context, "tablestore cool") LIMIT 10;