本节提供有关 NdbIndexScanOperation 类的信息。
- 父类
- 子类
无
- 描述
-
NdbIndexScanOperation类表示使用有序索引的扫描操作。此类继承自NdbScanOperation和NdbOperation。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的操作。
- 描述
此方法用于标记边界的结束;它在批量索引读取(即,使用多个范围时)使用。
- 签名
int end_of_bound ( Uint32 range_no )- 参数
边界所在的范围的编号。
- 返回值
0表示成功;-1表示失败。
- 描述
此方法用于检查扫描是否为降序。
- 签名
bool getDescending ( void ) const- 参数
无.
- 返回值
如果扫描按降序排序,则此方法返回
true;否则,它返回false。
本节提供有关 IndexBound 数据结构的信息。
- 父类
- 描述
IndexBound是一个结构,用于描述NdbRecord扫描的索引扫描边界。- 成员
-
下表显示了成员名称、类型和描述
表 2.47 IndexBound 结构成员名称、类型和描述
名称 类型 描述 low_keyconst char*包含扫描下限的行(或从头开始扫描时为 NULL)。low_key_countUint32下限中的列数(用于按部分前缀进行边界)。 low_inclusivebool<=关系为 True,<为 False。high_keyconst char*包含扫描上限的行(或扫描到结束时为 NULL)。high_key_countUint32上限中的列数(用于按部分前缀进行边界)。 high_inclusivebool>=关系为 True,>为 False。range_noUint32用于标识此边界的 value;可以使用 get_range_no()方法读取(请参阅 NdbIndexScanOperation::get_range_no())。此值必须小于 8192(如果未使用,则设置为零)。对于有序扫描,每个范围的range_no必须严格递增,否则结果集将无法正确排序。
有关更多信息,请参阅 第 2.3.22 节“NdbRecord 接口”。
- 描述
此方法用于使用有序索引读取元组。
- 签名
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表示失败。
- 描述
重置边界,并将操作放入下次调用
NdbTransaction::execute()时发送的列表中。- 签名
int reset_bounds ( bool forceSend = false )- 参数
设置
forceSend为true以强制立即发送操作。- 返回值
成功返回
0,失败返回-1。
- 描述
-
此方法定义范围扫描中使用的索引键的边界,并为使用
NdbRecord定义的索引扫描设置边界。与
NdbRecord一起使用时,调用此方法将范围添加到已通过调用NdbTransaction::scanIndex()定义的索引扫描操作。要添加多个范围,必须在设置了SF_MultiRange标志的情况下定义索引扫描操作。(请参阅 NdbScanOperation::ScanFlag。)如果通过多次调用
setBound()定义了多个编号范围,并且扫描已排序,则每个范围的范围编号必须大于先前定义的范围的范围编号。 - 签名
int setBound ( const NdbRecord* keyRecord, const IndexBound& bound )- 参数
-
与
NdbRecord一起使用时,此方法需要 2 个参数,如下所示keyRecord:这是一个对应于定义索引的键的NdbRecord结构。要添加的
bound(请参阅 NdbIndexScanOperation::IndexBound)。
- 返回值
成功返回
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:分区规范的长度。
keyRecord和bound的定义和使用方式与此方法的 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而不是等效对BoundLE和BoundGE。当表分区键是索引键的前缀时尤其如此。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 个参数
要设置其边界的属性的
name或id。边界
type—请参阅 NdbIndexScanOperation::BoundType。指向边界
value的指针(对于NULL使用0)。
- 返回值
成功返回
0,失败返回-1。