本節詳細說明如何產生文件 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 叢集上使用 X DevAPI,則自動產生的 _id
在整個叢集中必須是唯一的。透過將mysqlx_document_id_unique_prefix
設定為每個叢集執行個體唯一的值,您可以確保文件 ID 在所有執行個體中都是唯一的。
為了獲得最佳的 InnoDB 插入效能,_id
欄位必須是循序的(始終遞增)(至少在單一伺服器內)。_id
值的循序性質會在伺服器重新啟動時維持。
在多主機群組複寫或 InnoDB 叢集環境中,表格產生的 _id
值在執行個體之間是唯一的,以避免主索引鍵衝突並最大程度地減少交易認證。
本節說明文件 ID 的格式。
自動產生文件 ID 的格式為
unique_prefix | start_timestamp | serial |
---|---|---|
4 個位元組 | 8 個位元組 | 16 個位元組 |
其中
unique_prefix
是 InnoDB 叢集指派給執行個體的值,用於使同一叢集中所有執行個體的文件 ID 成為唯一值。unique_prefix
的範圍是 0 到 216-1,並以十六進位編碼。如果 InnoDB 叢集或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 叢集時,只要執行個體已正確設定
auto_increment_offset
和auto_increment_increment
系統變數(詳細資訊請參閱變數的說明),來自不同執行個體的相同表格插入不會有主索引鍵值衝突。