本節提供有關 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
用於識別此界限的值;可以使用 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()
方法採用此處列出的三個參數掃描使用的鎖定
mode
。這是一個LockMode
值;如需詳細資訊,包括允許的值,請參閱 NdbOperation::LockMode。一或多個掃描旗標;多個
flags
會像使用NdbScanOperation::readTuples()
時一樣進行OR
運算。請參閱 NdbScanOperation::ScanFlag 以取得可能的值。要在
parallel
中掃描的片段數;使用0
來指定自動最大值。-
batch
參數指定下一個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
的定義和使用方式與此方法的雙參數版本相同。 - 傳回值
成功時傳回
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
。