使用 SQL 查询数据时,可以通过数据表的映射表或多元索引的映射表查询数据,具体选择取决于对数据一致性和聚合精度的要求。
表格存储如何路由 SQL 查询
表格存储支持多种索引结构,适用于不同的查询和分析场景:
主键:数据表内置索引,支持单行读取(GetRow)和范围读取(GetRange)
二级索引表:自定义主键列的索引表
多元索引:基于倒排索引和时空索引,支持全文检索、多维查询等高级查询能力
SQL 查询功能支持通过数据表的映射表或多元索引的映射表查询数据。使用数据表的映射表时,表格存储会根据配置自动选择是否使用多元索引执行查询。详情请参见索引选择策略。
样例场景
以下示例使用名为 exampletable 的数据表,包含以下列:
|
列名 |
类型 |
角色 |
|
|
整型 |
主键列 |
|
|
字符串类型 |
属性列 |
|
|
字符串类型 |
属性列 |
该数据表已创建名为 exampletable_searchindex 的多元索引,索引包含 id(整型)和 context(文本类型)两列。
关键事实:name 列不在多元索引中。这决定了表格存储何时会回退到数据表执行查询。
根据需求选择查询方式:
使用数据表的映射表
创建数据表的映射表时,以下两个参数决定查询行为:
|
参数 |
可选值 |
作用 |
|
|
|
控制查询结果是否反映最新写入数据 |
|
|
|
控制是否允许表格存储将聚合查询路由到多元索引(多元索引的聚合结果可能为近似值) |
这两个参数的组合决定了以下三种方式的适用场景。
关于创建数据表映射表的详细操作,请参见创建表的映射关系。
方式一:最终一致,允许聚合近似(默认行为)
适用于对数据时效性要求不高、可以接受聚合近似结果的查询场景。表格存储会在 SELECT 列表中的所有列均被多元索引覆盖时,自动路由到多元索引执行查询,从而提升查询性能。
自动索引选择规则:表格存储检查 SELECT 列表中的所有列是否均包含在某个多元索引中。
若所有列均被覆盖,则路由到多元索引执行查询。
-
若有任意列不在索引中,则回退到数据表执行查询。
-
为数据表创建映射表,映射表名称为
exampletable,其他参数保持默认。CREATE TABLE `exampletable` (`id` BIGINT, `name` MEDIUMTEXT, `context` MEDIUMTEXT, PRIMARY KEY(id)) ENGINE='Tablestore'; -
查询数据。
以下语句查询所有列(
*)。由于name列不在exampletable_searchindex中,多元索引无法覆盖完整查询,表格存储回退到数据表执行查询。SELECT * FROM exampletable LIMIT 10;以下语句仅查询
id和context两列,两列均在exampletable_searchindex中,表格存储路由到多元索引执行查询。SELECT id,context FROM exampletable LIMIT 10;
-
方式二:强一致性读
适用于查询结果必须反映最新写入数据的场景。由于多元索引采用最终一致性,无法保证强一致性,在此模式下表格存储不会通过任何多元索引执行查询。
-
为数据表创建映射表,映射表名称为
exampletable,并将data_consistency设置为strong。CREATE TABLE `exampletable` (`id` BIGINT, `name` MEDIUMTEXT, `context` MEDIUMTEXT, PRIMARY KEY(id)) ENGINE='Tablestore', ENGINE_ATTRIBUTE='{"data_consistency": "strong"}'; -
查询数据。更多信息,请参见查询数据。
多元索引采用最终一致性,无法保证强一致性,因此表格存储不会通过任何多元索引执行查询。
方式三:最终一致,要求聚合精确
适用于需要最终一致性但要求聚合结果精确的场景。由于多元索引的聚合操作可能返回近似值,在此模式下表格存储不会通过任何多元索引执行查询。
-
为数据表创建映射表,映射表名称为
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}'; -
查询数据。更多信息,请参见查询数据。
多元索引的聚合操作可能返回近似值,因此表格存储不会通过任何多元索引执行查询。
使用多元索引的映射表
若需要使用全文检索等多元索引特有能力(例如对文本类型列使用 text_match 函数),可直接为指定多元索引创建映射表。通过这种方式执行的查询始终使用该多元索引,不受列覆盖范围限制。
关于创建多元索引映射表的详细操作,请参见创建多元索引的映射关系。
-
为多元索引创建映射表,映射表名称为
exampletable_searchindex_test。CREATE TABLE `exampletable_searchindex_test` (`id` BIGINT, `context` MEDIUMTEXT) ENGINE='searchindex' ENGINE_ATTRIBUTE='{"index_name": "exampletable_searchindex", "table_name": "exampletable"}' -
查询数据。以下示例使用
text_match函数对context列执行全文检索。SELECT id,context FROM exampletable_searchindex_test WHERE text_match(context, "tablestore cool") LIMIT 10;