本教程將向您介紹MySQL UUID,並演示如何將其用作表的主鍵(PK),並討論將其用作主鍵的優缺點。
MySQL UUID簡介
UUID
代表通用唯一識別字。UUID
是基於”RFC 4122“通用唯一識別字(UUID
)URN命名空間”)定義的。
UUID
被設計為在空間和時間全球獨一無二的數字。 預期兩個UUID值是不同的,即使它們在兩個獨立的伺服器上生成。
在MySQL中,UUID
值是一個128
位的數字,表示為以下格式的十五進制數字的utf8
字串:
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
要生成UUID
值,請使用UUID()
函數,如下所示:
UUID()
UUID()
函數返回符合RFC 4122
中描述的UUID
版本1的UUID
值。
例如,以下語句使用UUID()
函數來生成UUID
值:
mysql> SELECT UUID();
+--------------------------------------+
| UUID() |
+--------------------------------------+
| 9d6212cf-72fc-11e7-bdf0-f0def1e6646c |
+--------------------------------------+
1 row in set
MySQL UUID與自動遞增INT作為主鍵
優點
使用UUID
作為主鍵具有以下優點:
- UUID值在表,資料庫甚至在伺服器上都是唯一的,允許您從不同資料庫合併行或跨伺服器分發資料庫。
- UUID值不會公開有關數據的資訊,因此它們在URL中使用更安全。例如,如果
ID
為10
的客戶通過URL: http://www.example.com/customers/10/ 訪問他的帳戶,那麼很容易猜到有一個客戶11
,12
等,這可能是攻擊的目標。 - 可以在避免往返資料庫伺服器的任何地方生成
UUID
值。它也簡化了應用程式中的邏輯。 例如,要將數據插入到父表和子表中,必須首先插入父表,獲取生成的id
,然後將數據插入到子表中。通過使用UUID
,可以生成父表的主鍵值,並在事務中同時在父表和子表中插入行。
缺點
除了優勢之外,UUID值也有一些缺點:
- 存儲UUID值(16位元組)比整數(4位元組)或甚至大整數(8位元組)佔用更多的存儲空間。
- 調試似乎更加困難,想像一下
WHERE id ='9d6212cf-72fc-11e7-bdf0-f0def1e6646c'
和WHERE id = 10
那個舒服一點? - 使用UUID值可能會導致性能問題,因為它們的大小和沒有被排序。
MySQL UUID解決方案
在MySQL中,可以以緊湊格式(BINARY
)存儲UUID值,並通過以下功能顯示人機可讀格式(VARCHAR):
- UUID_TO_BIN
- BIN_TO_UUID
- IS_UUID
請注意,
UUID_TO_BIN()
,BIN_TO_UUID()
和IS_UUID()
函數僅在MySQL 8.0或更高版本中可用。
UUID_TO_BIN()
函數將UUID從人類可讀格式(VARCHAR
)轉換成用於存儲的緊湊格式(BINARY
)格式,並且BIN_TO_UUID()
函數將UUID從緊湊格式(BINARY
)轉換為人類可讀格式(VARCHAR
)。
如果參數是有效的字串格式UUID
,IS_UUID()
函數將返回1
。 如果參數不是有效的字串格式UUID
,則IS_UUID
函數返回0
,如果參數為NULL
,則IS_UUID()
函數返回NULL
。
以下是MySQL中有效的字串格式UUID
:
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
aaaaaaaabbbbccccddddeeeeeeeeeeee
{aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee}
MySQL UUID示例
我們來看一下使用UUID
作為主鍵的例子。
以下語句創建一個名為customers
的新表:
USE testdb;
CREATE TABLE customers (
id BINARY(16) PRIMARY KEY,
name VARCHAR(255)
);
要將UUID
值插入到id
列中,可以使用UUID()
和UUID_TO_BIN()
函數,如下所示:
INSERT INTO customers(id, name)
VALUES(UUID_TO_BIN(UUID()),'John Doe'),
(UUID_TO_BIN(UUID()),'Will Minsu'),
(UUID_TO_BIN(UUID()),'Mary Jane');
要從UUID列查詢數據,可以使用BIN_TO_UUID()
函數將二進位格式轉換為可讀取的格式:
SELECT
BIN_TO_UUID(id) id,
name
FROM
customers;
在本教學中,您已經瞭解了MySQL UUID以及如何將其用於主鍵列。