本節詳細說明如何產生文件 ID 以及如何解譯它們。X DevAPI 依賴伺服器式文件 ID 產生,這會導致所有用戶端的文件 ID 依序遞增。InnoDB 使用文件 ID 作為主索引鍵,這會帶來有效率的分頁分割和樹狀結構重組。
本節說明自動產生文件 ID 的屬性和格式。
文件的 _id 欄位在查詢期間的行為方式與文件的任何其他欄位相同,但一旦插入至集合後,其值就無法變更。_id 欄位用作集合的主索引鍵。您可以藉由在插入的文件中手動加入 ID 來覆寫自動產生文件 ID 的機制。
X 外掛程式並不知道插入至集合中的資料,包括您使用的任何手動文件 ID。使用手動文件 ID 時,您必須確保它們不會與伺服器可能自動產生的任何 ID 衝突(詳細資料請參閱文件 ID 產生),以避免因主索引鍵重複而發生的任何錯誤。
每當插入的文件中不存在 _id 欄位值時,伺服器就會產生 _id 值。用於文件的產生 _id 值會作為 add() 操作的 Result(Connector/J 的 Result)物件的一部分傳回至用戶端。如果您在 InnoDB Cluster 上使用 X DevAPI,則自動產生的 _id 在整個叢集中必須是唯一的。藉由將 mysqlx_document_id_unique_prefix 設定為每個叢集執行個體唯一的數值,您可以確保文件 ID 在所有執行個體中都是唯一的。
_id 欄位必須是循序的(總是遞增)才能達到最佳的 InnoDB 插入效能(至少在單一伺服器內)。_id 值的循序性質會在伺服器重新啟動後保留。
在多主群組複寫或 InnoDB Cluster 環境中,表格產生的 _id 值在不同執行個體之間是唯一的,以避免主索引鍵衝突並將交易認證降到最低。
本節說明文件 ID 的格式。
自動產生文件 ID 的格式如下
| unique_prefix | start_timestamp | serial |
|---|---|---|
| 4 個位元組 | 8 個位元組 | 16 個位元組 |
其中
unique_prefix是由 InnoDB Cluster 指派給執行個體的數值,用來讓來自相同叢集的所有執行個體的文件 ID 都是唯一的。unique_prefix的範圍從 0 到 216-1,這是以十六進位編碼。如果未由 InnoDB Cluster 或mysqlx_document_id_unique_prefix系統變數設定,則預設值為 0。start_timestamp是伺服器執行個體啟動時間的時間戳記,這是以十六進位編碼。在serial值溢位的機率極低的事件中,start_timestamp會遞增 1,然後serial值會從 0 重新開始。serial是每個執行個體的自動遞增整數序號值,這是以十六進位編碼,且範圍從 0 到 264-1。serial的初始值設定為auto_increment_offset系統變數,而值的遞增則是由auto_increment_increment系統變數設定。
此文件 ID 格式可確保
來自單一伺服器執行個體的插入,其主索引鍵值會單調遞增,雖然表格中值的間隔並不一致。
當使用多主群組複寫或 InnoDB Cluster 時,只要執行個體有正確設定的
auto_increment_offset和auto_increment_increment系統變數(詳細資料請參閱變數的描述),來自不同執行個體對同一表格的插入不會有主索引鍵值衝突。