2.3.18 NdbIndexScanOperation类

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

NdbIndexScanOperation 类概述

家长班

NdbScanOperation

儿童班

没有任何

描述

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

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

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

方法

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

表 2.44 NdbIndexScanOperation 类方法及说明

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

类型

该类NdbIndexScanOperation定义了一种公共类型 BoundType

此类还定义了一个 IndexBound 数据结构,用于使用 NdbRecord.

NdbIndexScanOperation::BoundType

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

描述

此类型用于描述有序的键绑定。

枚举值

下表显示了可能的值以及说明:

表 2.45 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.46 IndexBound 结构成员名称、类型和说明

姓名 类型 描述
low_key const char* 包含扫描下限(或NULL从头开始扫描)的行。
low_key_count Uint32 下限中的列数(用于部分前缀的边界)。
low_inclusive bool 关系为真,<=关系为假 <
high_key const char* 包含扫描上限(或NULL扫描到末尾)的行。
high_key_count Uint32 上限中的列数(用于部分前缀的边界)。
high_inclusive bool 关系为真,>=关系为假 >
range_no Uint32 识别此界限的值;可以使用该 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()方法采用此处列出的三个参数:

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

  • 一个或多个扫描标志;multiple flagsOR与 一起使用时一样被组合在一起 NdbScanOperation::readTuples()。有关可能的值,请参阅NdbScanOperation::ScanFlag

  • 要扫描的片段数 parallel;用于 0自动指定最大值。

  • 该参数指定下一个 方法调用batch将有多少条记录从服务器返回给客户端 。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: 这是一个指向 a 的指针PartitionSpec,它提供了额外的信息,使扫描一组减少的分区成为可能。

  • sizeOfPartInfo:分区规范的长度。

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

返回值

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

API 用法(在引入 NdbRecord 之前)

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

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

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

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

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

索引也存储所有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 个参数:

返回值

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