使用SQL查询存在数据延迟问题

问题现象

在新增或更新数据后,使用SQL查询数据时无法立即获取最新数据,存在一定的延迟现象。

可能原因

在为数据表创建多元索引后,使用SQL查询数据时,如果多元索引包含SQL中涉及的所有数据列,则SQL引擎将自动选择该多元索引进行数据查询。更多信息,请参见索引选择策略

而多元索引中的数据可能存在同步延迟,因此即使数据已成功写入数据表,SQL查询仍可能无法返回最新的结果。

解决方案

  • SQL显式指定不使用索引

    使用SQL查询数据时,在SQL语句中使用use index()命令显式指定执行查询时不考虑优先使用索引。

    例如数据表exampletablepknamecontext三个数据列,并且已创建包含这三个数据列的多元索引。查询数据时指定不使用索引的SQL示例如下。

    SELECT pk,name,context FROM exampletable use index();  -- 指定查询数据表时不考虑优先使用索引。
  • 使用数据读取接口查询数据

    如果您需要使用主键读取数据,您也可以使用数据读取接口。表格存储提供了GetRow接口用于读取单行数据以及BatchGetRow、GetRange等接口用于读取多行数据。更多信息,请参见读取数据

    接口

    说明

    适用场景

    GetRow

    根据指定的主键读取单行数据。

    适用于能确定完整主键且要读取行数较少的场景。

    BatchGetRow

    批量读取一个表或多个表中的若干行数据。

    适用于能确定完整主键,且需要读取行数较多或者要读取多个表中数据的场景。

    GetRange

    读取指定主键范围内的数据。

    适用于能确定完整主键范围或者主键前缀的场景。

  • 使用二级索引

    重要

    使用二级索引功能将产生额外的数据存储量。当向数据表写入数据时,建立索引和读取数据均会消耗计算资源。

    您可以选择在执行SQL查询数据时使用二级索引。具体操作如下:

    1. 为数据表创建二级索引。具体操作,请参见通过控制台使用二级索引

      推荐使用本地二级索引,以满足强一致性查询的要求。

    2. 您可以通过以下两种方式,在执行SQL查询数据时使用二级索引。

      例如数据表exampletablepknamecontext三个数据列,数据表的二级索引为exampletable_index,并且该索引包含这三个数据列。

      • 方式一:查询数据表时显式指定使用二级索引

        执行SQL进行数据查询时,如果未显式指定索引,表格存储会根据索引选择策略自动选择是否使用索引。

        通过use index()命令显式指定使用二级索引的SQL示例如下。

        SELECT pk,name,context FROM exampletable use index(exampletable_index);  -- 显式指定查询数据表时使用二级索引。
      • 方式二:查询二级索引映射表

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

        2. 执行SELECT语句查询二级索引映射表的SQL示例如下。

          SELECT pk,name,context FROM exampletable_index;  -- 指定查询二级索引的映射表。