浙江制做网站的公司,画册什么网站做方便,百度商桥置入网站,海口网站建设高端目录RowIteratorInit()Read()SetNullRowFlag()UnlockRow()StartPSIBatchMode()EndPSIBatchModeIfStarted()real_iterator()RowIterator 使用选定的访问方法读取单个表的上下文#xff1a;索引读取#xff0c;扫描等#xff0c;缓存的使用等。 它主要是用作接口#xff0c;但…
目录RowIteratorInit()Read()SetNullRowFlag()UnlockRow()StartPSIBatchMode()EndPSIBatchModeIfStarted()real_iterator()RowIterator 使用选定的访问方法读取单个表的上下文索引读取扫描等缓存的使用等。 它主要是用作接口但也包含一些私有成员函数这些函数对于许多实现都是有用的例如错误处理。 RowIterator是一个简单的迭代器。您对其进行初始化然后一次读取一个记录直到Read返回EOF。如果需要RowIterator可以从其他Iterators读取数据例如SortingIterator它从另一个RowIterator接收记录并对其进行排序。 抽象并不完全紧密。特别是它仍然留给TABLE一些细节例如要读取的列read_set。这意味着可能很难对两个表的联接进行排序。 使用方法
unique_ptrRowIterator iterator(new ...);
if (iterator-Init())return true;
while (iterator-Read() 0) {...
}Init() 初始化或重新初始化迭代器。 在尝试Read之前必须始终调用Init但是Init并不意味着Read。 您可以多次调用Init随后的调用将使迭代器倒回或重新定位具体取决于迭代器是否采用TABLE_REF并允许您重新读取记录。 Read() 读一行。 该行数据实际上不是从函数返回的它被放在表的记录缓冲区中如果有连接则放在表中即table- records [0]。 SetNullRowFlag() 将当前行缓冲区标记为包含或不包含NULL行这样如果您从中读取并且标志为true则无论缓冲区中实际上有什么通常是一些旧的剩余行您都只会得到NULL。 当迭代器没有产生任何行并且我们需要产生一个NULL补充行时它用于外部联接。Init或Read不一定会重置此标志因此如果您将其设置为true请确保在需要时也将其设置为false。 注意可以在不首先调用Init的情况下调用它。 UnlockRow() 在一些特定的查询中比如SELECT FOR UPDATE, UPDATE or DELETE查询正在读取的行将在上面上锁。这意味着锁的设置取决于优化器是否选择了一个表扫描或者使用索引。 但是在某些事务隔离级别下(读取或提交)当且仅当行因为WHERE这个谓词失败只有返回的行受到保护那些没有返回的行就不会受到保护了。 所以如果Read()返回一行数据如果不使用它就应该Read()之后调用UnlockRow()它将允许存储引擎在这种情况下释放行锁。 StartPSIBatchMode() 启动性能模式批处理模式。 PFS批处理模式可以减轻性能模式的开销该性能模式通常应用于整个联接的最内表。 如果在扫描表之前先启动它然后再结束它则整个处理程序调用集将作为一组并且成本将平均分配。这样可以减少计时器开销。 如果启动PFS批处理模式则还必须注意在扫描结束时以一种另一种方式结束它。请注意即使查询突然结束(达到LIMIT或者发生错误)也必须结束它。最简单的解决方法就是在扫描结束时在根迭代器上简单调用EndPSIBatchModeIfStarted()。 开始批处理和结束的规则是 1、如果迭代器只有一个子类则将所有StartPSIBatchMode()的调用转发给它。 2、如果驱动迭代器(使用for循环或者类似的方法读取行)需要使用PFSBatchMode 3、如果迭代器有多个子类忽略StartPSIBatchMode()的调用并且根据需要自行处理批处理模式 所以在扫描单个表时通常会为该表激活批处理模式因为我们在根迭代器上调用该函数并且一直向下传入表迭代器。但是调用后该调用将被忽略并且迭代器需要根据需要自行激活批处理模式。 EndPSIBatchModeIfStarted() 结束性能模式批处理模式 具有子级的迭代器(复合迭代器)必须将该函数调用转发给所有子迭代器。这样可以确保在对根迭代器进行这样的调用之后所有处理程序都退出批处理模式。 real_iterator() 如果该迭代器包装了其他迭代器需要将该迭代器向下转换为特定的迭代器类型。