文档首页
MySQL NDB Cluster API 开发人员指南
相关文档 下载本手册
PDF (US Ltr) - 3.6Mb
PDF (A4) - 3.6Mb


MySQL NDB Cluster API 开发人员指南  /  ...  /  NdbIndexScanOperation 类

2.3.18 NdbIndexScanOperation 类

本节提供有关 NdbIndexScanOperation 类的信息。

NdbIndexScanOperation 类概述

父类

NdbScanOperation

子类

描述

NdbIndexScanOperation 类表示使用有序索引的扫描操作。此类继承自 NdbScanOperationNdbOperation

NdbIndexScanOperation 仅用于有序索引;要使用唯一的哈希索引,请使用 NdbIndexOperation

有关使用 NdbIndexScanOperation 的更多信息,请参阅 第 1.4.2.3.3 节“扫描操作”第 1.4.2.3.4 节“使用扫描更新或删除行”

方法

下表列出了此类的公共方法以及每个方法的用途

表 2.45 NdbIndexScanOperation 类方法和描述

名称 描述
end_of_bound() 标记边界的结束
get_range_no() 获取当前行的范围编号
getDescending() 检查当前扫描是否已排序
getSorted() 检查当前扫描是否已排序
readTuples() 使用有序索引读取元组
reset_bounds() 重置边界,将操作放入发送队列
setBound() 为范围扫描定义索引键的边界

类型

NdbIndexScanOperation 类定义了一个公共类型 BoundType

此类还定义了一个 IndexBound 数据结构,用于使用 NdbRecord 的操作。

NdbIndexScanOperation::BoundType

本节提供有关 BoundType 数据类型的信息。

描述

此类型用于描述有序键边界。

枚举值

下表显示了可能的值及其描述

表 2.46 NdbIndexScanOperation::BoundType 值、数字等效项和描述

数值 描述
BoundLE 0 下界
BoundLT 1 严格下界
BoundGE 2 上界
BoundGT 3 严格上界
BoundEQ 4 相等

此处显示的数值是安全的;也就是说,它们在 API 中是固定的,因此可以显式计算和使用。

NdbIndexScanOperation::end_of_bound()

描述

此方法用于标记边界的结束;它在批量索引读取(即,使用多个范围时)使用。

签名
int end_of_bound
    (
      Uint32 range_no
    )
参数

边界所在的范围的编号。

返回值

0 表示成功;-1 表示失败。

NdbIndexScanOperation::getDescending()

描述

此方法用于检查扫描是否为降序。

签名
bool getDescending
    (
      void
    ) const
参数

.

返回值

如果扫描按降序排序,则此方法返回 true;否则,它返回 false

NdbIndexScanOperation::get_range_no()

描述

此方法返回当前行的范围编号。

签名
int get_range_no
    (
      void
    )
参数

.

返回值

范围编号(整数)。

NdbIndexScanOperation::getSorted()

描述

此方法用于检查扫描是否已排序。

签名
bool getSorted
    (
      void
    ) const
参数

.

返回值

如果扫描已排序,则为 true,否则为 false

NdbIndexScanOperation::IndexBound

本节提供有关 IndexBound 数据结构的信息。

父类

NdbIndexScanOperation

描述

IndexBound 是一个结构,用于描述 NdbRecord 扫描的索引扫描边界。

成员

下表显示了成员名称、类型和描述

表 2.47 IndexBound 结构成员名称、类型和描述

名称 类型 描述
low_key const char* 包含扫描下限的行(或从头开始扫描时为 NULL)。
low_key_count Uint32 下限中的列数(用于按部分前缀进行边界)。
low_inclusive bool <= 关系为 True,< 为 False。
high_key const char* 包含扫描上限的行(或扫描到结束时为 NULL)。
high_key_count Uint32 上限中的列数(用于按部分前缀进行边界)。
high_inclusive bool >= 关系为 True,> 为 False。
range_no Uint32 用于标识此边界的 value;可以使用 get_range_no() 方法读取(请参阅 NdbIndexScanOperation::get_range_no())。此值必须小于 8192(如果未使用,则设置为零)。对于有序扫描,每个范围的 range_no 必须严格递增,否则结果集将无法正确排序。

有关更多信息,请参阅 第 2.3.22 节“NdbRecord 接口”

NdbIndexScanOperation::readTuples()

描述

此方法用于使用有序索引读取元组。

签名
virtual int readTuples
    (
      LockMode mode = LM_Read,
      Uint32   flags = 0,
      Uint32   parallel = 0,
      Uint32   batch = 0

    )
参数

readTuples() 方法采用此处列出的三个参数

  • 用于扫描的锁 模式。这是一个 LockMode 值;有关更多信息(包括允许的值),请参阅 NdbOperation::LockMode

  • 一个或多个扫描标志;与 NdbScanOperation::readTuples() 一起使用时,多个 标志 通过 OR 进行组合。有关可能的值,请参阅 NdbScanOperation::ScanFlag

  • 并行 扫描的片段数;使用 0 自动指定最大值。

  • 批量 参数指定下一个 NdbScanOperation::nextResult(true) 方法调用从服务器返回到客户端的记录数。使用 0 自动指定最大值。

    注意

    在 MySQL 5.1.12 之前,此参数被忽略,并使用最大值。(错误 #20252)

返回值

一个整数:0 表示成功;-1 表示失败。

NdbIndexScanOperation::reset_bounds()

描述

重置边界,并将操作放入下次调用 NdbTransaction::execute() 时发送的列表中。

签名
int reset_bounds
    (
      bool forceSend = false
    )
参数

设置 forceSendtrue 以强制立即发送操作。

返回值

成功返回 0,失败返回 -1

NdbIndexScanOperation::setBound()

描述

此方法定义范围扫描中使用的索引键的边界,并为使用 NdbRecord 定义的索引扫描设置边界。

NdbRecord 一起使用时,调用此方法将范围添加到已通过调用 NdbTransaction::scanIndex() 定义的索引扫描操作。要添加多个范围,必须在设置了 SF_MultiRange 标志的情况下定义索引扫描操作。(请参阅 NdbScanOperation::ScanFlag。)

如果通过多次调用 setBound() 定义了多个编号范围,并且扫描已排序,则每个范围的范围编号必须大于先前定义的范围的范围编号。

签名
int setBound
    (
      const NdbRecord* keyRecord,
      const IndexBound& bound
    )
参数

NdbRecord 一起使用时,此方法需要 2 个参数,如下所示

返回值

成功返回 0,失败返回 -1

当应用程序知道仅在特定分区内才能找到范围内行时,可以使用此方法的另一个版本。这与之前显示的相同,只是添加了一个 PartitionSpec。这样做会将扫描限制在单个分区,从而提高系统效率。

签名(指定分区时)
int setBound
    (
      const NdbRecord* keyRecord,
      const IndexBound& bound,
      const Ndb::PartitionSpec* partInfo,
      Uint32 sizeOfPartInfo = 0
    )
参数(指定分区时)

也可以使用以下四个参数调用此方法

  • keyRecord:这是一个对应于定义索引的键的 NdbRecord 结构。

  • 要添加到扫描的 bound(请参阅 NdbIndexScanOperation::IndexBound)。

  • partInfo:这是一个指向 PartitionSpec 的指针,它提供了一些额外信息,可以扫描减少的分区集。

  • sizeOfPartInfo:分区规范的长度。

keyRecordbound 的定义和使用方式与此方法的 2 参数版本相同。

返回值

成功返回 0,失败返回 -1

API 用法(在引入 NdbRecord 之前)

每个索引键可以有下限、上限或两者兼有。将键设置为某个值定义了上限和下限。边界可以按任意顺序定义。冲突的定义会导致错误。

必须在索引键的初始序列上设置边界,并且除最后一个边界外,所有边界都必须是非严格的。这意味着,例如,允许使用 a >= 2 AND b > 3,但不允许使用 a > 2 AND b >= 3

扫描当前可能会返回不满足边界的元组。例如,<= 2 && b <= 3 不仅扫描索引到 (a=2, b=3),还会返回任何 (a=1, b=4)

当基于相等性设置边界时,最好使用 BoundEQ 而不是等效对 BoundLEBoundGE。当表分区键是索引键的前缀时尤其如此。

NULL 被认为小于任何非 NULL 值,并且等于另一个 NULL 值。要执行与 NULL 的比较,请使用带有空指针 (0) 的 setBound()

索引还存储全 NULL 键,并且使用空边界集执行索引扫描将返回表中的所有元组。

签名( API)

使用 API,可以通过以下两种方式之一调用此方法。这两种方法都使用边界类型和值;第一种方法还使用边界的名称,如下所示

int setBound
    (
      const char* name,
      int         type,
      const void* value
    )

API 下调用此方法的第二种方法使用边界的 ID 而不是名称,如下所示

int setBound
    (
      Uint32      id,
      int         type,
      const void* value
    )
参数( API)

此方法需要 3 个参数

  • 要设置其边界的属性的 nameid

  • 边界 type—请参阅 NdbIndexScanOperation::BoundType

  • 指向边界 value 的指针(对于 NULL 使用 0)。

返回值

成功返回 0,失败返回 -1