MySQL UUID和主鍵

2019-10-16 22:56:49

本教學將向您介紹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中使用更安全。例如,如果ID10的客戶通過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)。

如果引數是有效的字串格式UUIDIS_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以及如何將其用於主鍵列。