在 NDB
資料表的資料表註解或欄位註解中,可以設定許多特定於 NDB Cluster 的選項。用於控制從任何複本讀取和分割區平衡的資料表層級選項,可以使用 NDB_TABLE
嵌入在資料表註解中。
NDB_COLUMN
可用於欄位註解中,以設定 NDB
用於儲存 blob 值的部分的 blob 部分資料表欄位的大小至最大值。這適用於 BLOB
、MEDIUMBLOB
、LONGBLOB
、TEXT
、MEDIUMTEXT
、LONGTEXT
和 JSON
欄位。欄位註解還可以用於控制 blob 欄位的內嵌大小。NDB_COLUMN
註解不支援 TINYBLOB
或 TINYTEXT
欄位,因為這些欄位只有固定大小的內嵌部分,沒有單獨的部分可儲存在其他地方。
NDB_TABLE
可用於資料表註解中,以設定與分割區平衡和資料表是否完全複寫等相關的選項。
本節的其餘部分將說明這些選項及其用法。
NDB_COLUMN 選項
在 NDB Cluster 中,CREATE TABLE
或 ALTER TABLE
陳述式中的欄位註解也可用於指定 NDB_COLUMN
選項。NDB
支援兩個欄位註解選項 BLOB_INLINE_SIZE
和 MAX_BLOB_PART_SIZE
。這些選項的語法如下所示
COMMENT 'NDB_COLUMN=speclist'
speclist := spec[,spec]
spec :=
BLOB_INLINE_SIZE=value
| MAX_BLOB_PART_SIZE[={0|1}]
BLOB_INLINE_SIZE
指定欄位要內嵌儲存的位元組數;其預期值是 1 到 29980(含)範圍內的整數。設定大於 29980 的值會引發錯誤;允許設定小於 1 的值,但會導致使用欄位類型的預設內嵌大小。
您應該注意,此選項的最大值實際上是可以在 NDB
資料表的一列中儲存的最大位元組數;列中的每個欄位都會計入此總數。
您還應該記住,尤其是在使用 TEXT
欄位時,MAX_BLOB_PART_SIZE
或 BLOB_INLINE_SIZE
設定的值代表以位元組為單位的欄位大小。它不表示字元數,字元數會根據欄位使用的字元集和定序而變化。
若要查看此選項的效果,請先建立一個具有兩個 BLOB
欄位的資料表,一個 (b1
) 沒有額外的選項,另一個 (b2
) 具有 BLOB_INLINE_SIZE
的設定,如下所示
mysql> CREATE TABLE t1 (
-> a INT NOT NULL PRIMARY KEY,
-> b1 BLOB,
-> b2 BLOB COMMENT 'NDB_COLUMN=BLOB_INLINE_SIZE=8000'
-> ) ENGINE NDB;
Query OK, 0 rows affected (0.32 sec)
您可以透過查詢 ndbinfo.blobs
資料表,查看 BLOB
欄位的 BLOB_INLINE_SIZE
設定,如下所示
mysql> SELECT
-> column_name AS 'Column Name',
-> inline_size AS 'Inline Size',
-> part_size AS 'Blob Part Size'
-> FROM ndbinfo.blobs
-> WHERE table_name = 't1';
+-------------+-------------+----------------+
| Column Name | Inline Size | Blob Part Size |
+-------------+-------------+----------------+
| b1 | 256 | 2000 |
| b2 | 8000 | 2000 |
+-------------+-------------+----------------+
2 rows in set (0.01 sec)
您也可以檢查 ndb_desc 公用程式的輸出,如下所示,相關的行會以強調文字顯示
$> ndb_desc -d test t1
-- t --
Version: 1
Fragment type: HashMapPartition
K Value: 6
Min load factor: 78
Max load factor: 80
Temporary table: no
Number of attributes: 3
Number of primary keys: 1
Length of frm data: 945
Max Rows: 0
Row Checksum: 1
Row GCI: 1
SingleUserMode: 0
ForceVarPart: 1
PartitionCount: 2
FragmentCount: 2
PartitionBalance: FOR_RP_BY_LDM
ExtraRowGciBits: 0
ExtraRowAuthorBits: 0
TableStatus: Retrieved
Table options: readbackup
HashMap: DEFAULT-HASHMAP-3840-2
-- Attributes --
a Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
b1 Blob(256,2000,0) NULL AT=MEDIUM_VAR ST=MEMORY BV=2 BT=NDB$BLOB_64_1
b2 Blob(8000,2000,0) NULL AT=MEDIUM_VAR ST=MEMORY BV=2 BT=NDB$BLOB_64_2
-- Indexes --
PRIMARY KEY(a) - UniqueHashIndex
PRIMARY(a) - OrderedIndex
對於 MAX_BLOB_PART_SIZE
,=
符號和後面的值是可選的。使用 0 或 1 以外的任何值都會導致語法錯誤。
在欄位註解中使用 MAX_BLOB_PART_SIZE
的效果是將 TEXT
或 BLOB
欄位的 blob 部分大小設定為 NDB
支援的最大位元組數 (13948)。此選項可以套用至 MySQL 支援的任何 blob 欄位類型,但 TINYBLOB
或 TINYTEXT
除外(BLOB
、MEDIUMBLOB
、LONGBLOB
、TEXT
、MEDIUMTEXT
、LONGTEXT
)。與 BLOB_INLINE_SIZE
不同,MAX_BLOB_PART_SIZE
對 JSON
欄位沒有影響。
若要查看此選項的效果,我們首先在 mysql 用戶端中執行以下 SQL 陳述式,以建立一個具有兩個 BLOB
欄位的資料表,一個 (c1
) 沒有額外的選項,另一個 (c2
) 具有 MAX_BLOB_PART_SIZE
mysql> CREATE TABLE test.t2 (
-> p INT PRIMARY KEY,
-> c1 BLOB,
-> c2 BLOB COMMENT 'NDB_COLUMN=MAX_BLOB_PART_SIZE'
-> ) ENGINE NDB;
Query OK, 0 rows affected (0.32 sec)
從系統 shell 中,執行 ndb_desc 公用程式以取得剛建立的資料表的相關資訊,如本例所示
$> ndb_desc -d test t2
-- t --
Version: 1
Fragment type: HashMapPartition
K Value: 6
Min load factor: 78
Max load factor: 80
Temporary table: no
Number of attributes: 3
Number of primary keys: 1
Length of frm data: 324
Row Checksum: 1
Row GCI: 1
SingleUserMode: 0
ForceVarPart: 1
FragmentCount: 2
ExtraRowGciBits: 0
ExtraRowAuthorBits: 0
TableStatus: Retrieved
HashMap: DEFAULT-HASHMAP-3840-2
-- Attributes --
p Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
c1 Blob(256,2000,0) NULL AT=MEDIUM_VAR ST=MEMORY BV=2 BT=NDB$BLOB_22_1
c2 Blob(256,13948,0) NULL AT=MEDIUM_VAR ST=MEMORY BV=2 BT=NDB$BLOB_22_2
-- Indexes --
PRIMARY KEY(p) - UniqueHashIndex
PRIMARY(p) - OrderedIndex
輸出中的欄位資訊列在 Attributes
下;對於欄位 c1
和 c2
,會在此處以強調文字顯示。對於 c1
,blob 部分大小為 2000,這是預設值;對於 c2
,它為 13948,由 MAX_BLOB_PART_SIZE
設定。
您也可以查詢 ndbinfo.blobs
資料表來查看,如下所示
mysql> SELECT
-> column_name AS 'Column Name',
-> inline_size AS 'Inline Size',
-> part_size AS 'Blob Part Size'
-> FROM ndbinfo.blobs
-> WHERE table_name = 't2';
+-------------+-------------+----------------+
| Column Name | Inline Size | Blob Part Size |
+-------------+-------------+----------------+
| c1 | 256 | 2000 |
| c2 | 256 | 13948 |
+-------------+-------------+----------------+
2 rows in set (0.00 sec)
您可以使用 ALTER TABLE
陳述式變更 NDB
資料表的指定 blob 欄位的 blob 部分大小,例如這個陳述式,然後使用 SHOW CREATE TABLE
驗證變更
mysql> ALTER TABLE test.t2
-> DROP COLUMN c1,
-> ADD COLUMN c1 BLOB COMMENT 'NDB_COLUMN=MAX_BLOB_PART_SIZE',
-> CHANGE COLUMN c2 c2 BLOB AFTER c1;
Query OK, 0 rows affected (0.47 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE test.t2\G
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t2` (
`p` int(11) NOT NULL,
`c1` blob COMMENT 'NDB_COLUMN=MAX_BLOB_PART_SIZE',
`c2` blob,
PRIMARY KEY (`p`)
) ENGINE=ndbcluster DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
mysql> EXIT
Bye
ndb_desc 的輸出顯示,欄位的 blob 部分大小已如預期般變更
$> ndb_desc -d test t2
-- t --
Version: 16777220
Fragment type: HashMapPartition
K Value: 6
Min load factor: 78
Max load factor: 80
Temporary table: no
Number of attributes: 3
Number of primary keys: 1
Length of frm data: 324
Row Checksum: 1
Row GCI: 1
SingleUserMode: 0
ForceVarPart: 1
FragmentCount: 2
ExtraRowGciBits: 0
ExtraRowAuthorBits: 0
TableStatus: Retrieved
HashMap: DEFAULT-HASHMAP-3840-2
-- Attributes --
p Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
c1 Blob(256,13948,0) NULL AT=MEDIUM_VAR ST=MEMORY BV=2 BT=NDB$BLOB_26_1
c2 Blob(256,2000,0) NULL AT=MEDIUM_VAR ST=MEMORY BV=2 BT=NDB$BLOB_26_2
-- Indexes --
PRIMARY KEY(p) - UniqueHashIndex
PRIMARY(p) - OrderedIndex
您也可以再次對 ndbinfo.blobs
執行查詢,以查看變更
mysql> SELECT
-> column_name AS 'Column Name',
-> inline_size AS 'Inline Size',
-> part_size AS 'Blob Part Size'
-> FROM ndbinfo.blobs
-> WHERE table_name = 't2';
+-------------+-------------+----------------+
| Column Name | Inline Size | Blob Part Size |
+-------------+-------------+----------------+
| c1 | 256 | 13948 |
| c2 | 256 | 2000 |
+-------------+-------------+----------------+
2 rows in set (0.00 sec)
可以為 blob 欄位設定 BLOB_INLINE_SIZE
和 MAX_BLOB_PART_SIZE
,如這個 CREATE TABLE
陳述式所示
mysql> CREATE TABLE test.t3 (
-> p INT NOT NULL PRIMARY KEY,
-> c1 JSON,
-> c2 JSON COMMENT 'NDB_COLUMN=BLOB_INLINE_SIZE=5000,MAX_BLOB_PART_SIZE'
-> ) ENGINE NDB;
Query OK, 0 rows affected (0.28 sec)
查詢 blobs
資料表會顯示,陳述式如預期般運作
mysql> SELECT
-> column_name AS 'Column Name',
-> inline_size AS 'Inline Size',
-> part_size AS 'Blob Part Size'
-> FROM ndbinfo.blobs
-> WHERE table_name = 't3';
+-------------+-------------+----------------+
| Column Name | Inline Size | Blob Part Size |
+-------------+-------------+----------------+
| c1 | 4000 | 8100 |
| c2 | 5000 | 8100 |
+-------------+-------------+----------------+
2 rows in set (0.00 sec)
您也可以透過檢查 ndb_desc 的輸出,驗證陳述式是否如預期般運作。
變更欄位的 blob 部分大小必須使用複製的 ALTER TABLE
來完成;此操作無法在線上執行(請參閱第 25.6.12 節「NDB Cluster 中使用 ALTER TABLE 的線上操作」)。
如需有關 NDB
如何儲存 blob 類型欄位的詳細資訊,請參閱字串類型儲存需求。
NDB_TABLE 選項
對於 NDB Cluster 資料表,CREATE TABLE
或 ALTER TABLE
陳述式中的資料表註解也可用於指定 NDB_TABLE
選項,其中包含一個或多個名稱-值配對,如果需要,配對之間以逗號分隔,並在字串 NDB_TABLE=
之後。名稱和值的完整語法如下所示
COMMENT="NDB_TABLE=ndb_table_option[,ndb_table_option[,...]]"
ndb_table_option: {
NOLOGGING={1 | 0}
| READ_BACKUP={1 | 0}
| PARTITION_BALANCE={FOR_RP_BY_NODE | FOR_RA_BY_NODE | FOR_RP_BY_LDM
| FOR_RA_BY_LDM | FOR_RA_BY_LDM_X_2
| FOR_RA_BY_LDM_X_3 | FOR_RA_BY_LDM_X_4}
| FULLY_REPLICATED={1 | 0}
}
引號字串中不允許有空格。字串不區分大小寫。
以下段落將更詳細地說明可以透過這種方式在註解中設定的四個 NDB
資料表選項。
NOLOGGING
:根據預設,NDB
資料表會記錄並檢查點。這使它們可以承受整個叢集故障。在建立或變更資料表時使用 NOLOGGING
表示此資料表不會重做記錄或包含在本機檢查點中。在這種情況下,資料表仍然在資料節點之間複寫以實現高可用性,並使用交易進行更新,但對其進行的變更不會記錄在資料節點的重做記錄中,並且其內容不會檢查點到磁碟;當從叢集故障復原時,叢集會保留資料表定義,但不會保留其任何資料列,也就是說,資料表為空。
使用這種非記錄資料表會減少資料節點對磁碟 I/O 和儲存空間的需求,以及檢查點 CPU 的 CPU。這可能適用於經常更新的短期資料,並且在不太可能發生全面叢集故障的情況下,可以接受所有資料的遺失。
也可以使用 ndb_table_no_logging
系統變數,使在此變數生效期間建立或變更的任何 NDB 資料表,如同使用 NOLOGGING
註解建立一樣。與直接使用註解不同的是,在這種情況下,SHOW CREATE TABLE
的輸出中沒有任何內容表示它是非記錄資料表。建議使用資料表註解方法,因為它可提供該功能的每個資料表控制,並且資料表結構描述的這方面會嵌入在資料表建立陳述式中,SQL 型工具可以輕鬆找到它。
READ_BACKUP
:將此選項設定為 1 的效果與啟用 ndb_read_backup
的效果相同;啟用從任何複本讀取。這樣做可以大幅提高從資料表讀取的效能,但寫入效能的成本相對較小。1 是 READ_BACKUP
的預設值,而 ndb_read_backup
的預設值為 ON
(先前,根據預設,會停用從任何複本讀取)。
您可以使用類似於此處所示的其中一個 ALTER TABLE
陳述式,在線上設定現有資料表的 READ_BACKUP
ALTER TABLE ... ALGORITHM=INPLACE, COMMENT="NDB_TABLE=READ_BACKUP=1";
ALTER TABLE ... ALGORITHM=INPLACE, COMMENT="NDB_TABLE=READ_BACKUP=0";
如需有關 ALTER TABLE
的 ALGORITHM
選項的詳細資訊,請參閱第 25.6.12 節「NDB Cluster 中使用 ALTER TABLE 的線上操作」。
PARTITION_BALANCE
:提供對分割區指派和放置的額外控制。支援以下四種配置
FOR_RP_BY_NODE
:每個節點一個分割區。每個節點上只有一個 LDM 儲存主要分割區。每個分割區都儲存在所有節點上的同一個 LDM(相同的 ID)中。
FOR_RA_BY_NODE
:每個節點群組一個分割區。每個節點儲存一個單一分割區,該分割區可以是主要複本或備份複本。每個分割區都儲存在所有節點上的同一個 LDM 中。
FOR_RP_BY_LDM
:每個節點上的每個 LDM 一個分割區;預設值。如果
READ_BACKUP
設定為 1,則使用此設定。FOR_RA_BY_LDM
:每個節點群組中的每個 LDM 一個分割區。這些分割區可以是主要分割區或備份分割區。
FOR_RA_BY_LDM_X_2
:每個節點群組中的每個 LDM 兩個分割區。這些分割區可以是主要分割區或備份分割區。
FOR_RA_BY_LDM_X_3
:每個節點群組中的每個 LDM 三個分割區。這些分割區可以是主要分割區或備份分割區。
FOR_RA_BY_LDM_X_4
:每個節點群組中的每個 LDM 四個分割區。這些分割區可以是主要分割區或備份分割區。
PARTITION_BALANCE
是設定每個表格分割區數量的首選介面。使用 MAX_ROWS
來強制分割區數量已被棄用,但為了向後相容性仍然支援;它可能會在 MySQL NDB Cluster 的未來版本中移除。(Bug #81759,Bug #23544301)
FULLY_REPLICATED
控制表格是否完全複寫,也就是說,每個資料節點是否擁有表格的完整副本。要啟用表格的完全複寫,請使用 FULLY_REPLICATED=1
。
此設定也可以使用 ndb_fully_replicated
系統變數來控制。將其設定為 ON
預設會為所有新的 NDB
表格啟用此選項;預設值為 OFF
。ndb_data_node_neighbour
系統變數也用於完全複寫的表格,以確保在存取完全複寫的表格時,我們存取的是本地於此 MySQL 伺服器的資料節點。
以下範例展示在使用這種註解建立 NDB
表格時的 CREATE TABLE
陳述式。
mysql> CREATE TABLE t1 (
> c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
> c2 VARCHAR(100),
> c3 VARCHAR(100) )
> ENGINE=NDB
>
COMMENT="NDB_TABLE=READ_BACKUP=0,PARTITION_BALANCE=FOR_RP_BY_NODE";
註解會顯示為 SHOW CREATE TABLE
的輸出的一部分。註解的文字也可以從查詢 MySQL Information Schema TABLES
表格取得,如下例所示。
mysql> SELECT TABLE_NAME, TABLE_SCHEMA, TABLE_COMMENT
> FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME="t1"\G
*************************** 1. row ***************************
TABLE_NAME: t1
TABLE_SCHEMA: test
TABLE_COMMENT: NDB_TABLE=READ_BACKUP=0,PARTITION_BALANCE=FOR_RP_BY_NODE
1 row in set (0.01 sec)
此註解語法也支援使用 ALTER TABLE
陳述式來操作 NDB
表格,如下所示。
mysql> ALTER TABLE t1 COMMENT="NDB_TABLE=PARTITION_BALANCE=FOR_RA_BY_NODE";
Query OK, 0 rows affected (0.40 sec)
Records: 0 Duplicates: 0 Warnings: 0
TABLE_COMMENT
欄位會顯示重新建立表格所需的註解,使其與 ALTER TABLE
陳述式之後的狀態相同,如下所示。
mysql> SELECT TABLE_NAME, TABLE_SCHEMA, TABLE_COMMENT
-> FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME="t1"\G
*************************** 1. row ***************************
TABLE_NAME: t1
TABLE_SCHEMA: test
TABLE_COMMENT: NDB_TABLE=READ_BACKUP=0,PARTITION_BALANCE=FOR_RP_BY_NODE
1 row in set (0.01 sec)
mysql> SELECT TABLE_NAME, TABLE_SCHEMA, TABLE_COMMENT
> FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME="t1";
+------------+--------------+--------------------------------------------------+
| TABLE_NAME | TABLE_SCHEMA | TABLE_COMMENT |
+------------+--------------+--------------------------------------------------+
| t1 | c | NDB_TABLE=PARTITION_BALANCE=FOR_RA_BY_NODE |
| t1 | d | |
+------------+--------------+--------------------------------------------------+
2 rows in set (0.01 sec)
請記住,與 ALTER TABLE
一起使用的表格註解會取代表格可能已有的任何現有註解。
mysql> ALTER TABLE t1 COMMENT="NDB_TABLE=PARTITION_BALANCE=FOR_RA_BY_NODE";
Query OK, 0 rows affected (0.40 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SELECT TABLE_NAME, TABLE_SCHEMA, TABLE_COMMENT
> FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME="t1";
+------------+--------------+--------------------------------------------------+
| TABLE_NAME | TABLE_SCHEMA | TABLE_COMMENT |
+------------+--------------+--------------------------------------------------+
| t1 | c | NDB_TABLE=PARTITION_BALANCE=FOR_RA_BY_NODE |
| t1 | d | |
+------------+--------------+--------------------------------------------------+
2 rows in set (0.01 sec)
您也可以在 ndb_desc 的輸出中看到 PARTITION_BALANCE
選項的值。ndb_desc 也會顯示表格是否設定了 READ_BACKUP
和 FULLY_REPLICATED
選項。有關更多資訊,請參閱此程式的描述。