本节提供有关 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_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 接口”。
- 描述
此方法用于使用有序索引读取元组。
- 签名
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
。