文件首頁
MySQL NDB Cluster API 開發人員指南
相關文件 下載本手冊
PDF (US Ltr) - 3.6Mb
PDF (A4) - 3.6Mb


MySQL NDB Cluster API 開發人員指南  /  ...  /  NdbIndexScanOperation 類別

2.3.18 NdbIndexScanOperation 類別

本節提供有關 NdbIndexScanOperation 類別的資訊。

NdbIndexScanOperation 類別概觀

父類別

NdbScanOperation

子類別

描述

NdbIndexScanOperation 類別代表使用排序索引的掃描作業。此類別繼承自 NdbScanOperationNdbOperation

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 的作業使用。

NdbIndexScanOperation::BoundType

本節提供有關 BoundType 資料類型的資訊。

描述

此類型用於描述排序的鍵界限。

列舉值

下表顯示可能的值以及說明

表 2.46 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.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 介面」

NdbIndexScanOperation::readTuples()

描述

此方法用於使用排序索引讀取元組。

簽名
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 表示失敗。

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:這是 PartitionSpec 的指標,它會提供額外資訊,使其能夠掃描較小的分割區集。

  • sizeOfPartInfo:分割區規格的長度。

keyRecordbound 的定義和使用方式與此方法的雙參數版本相同。

傳回值

成功時傳回 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,而不是等效的配對 BoundLEBoundGE。當資料表分割區索引鍵是索引鍵的前置字元時,尤其如此。

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 個參數

傳回值

成功時傳回 0,失敗時傳回 -1