MySQL UUID和主鍵

本教程將向您介紹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以及如何將其用於主鍵列。


上一篇: MySQL技巧 下一篇: MySQL存儲過程