MySQL UUID與INT自增作為主鍵比較

MySQL UUID與INT自增作為主鍵比較

MySQL UUID與INT自增作為主鍵比較


資料來源:https://www.begtut.com/mysql/mysql-uuid.html

https://medium.com/corneltek/innodb-primary-key-with-uuid-and-auto-increment-integer-508d427688dc

copilot


UUID用作主鍵優點:

    01.表/資料庫甚至伺服器之間的UUID值是唯一的,它們允許您合併來自不同資料庫的行或跨伺服器分發資料庫。
    02.UUID值不會公開有關資料的信息,因此在URL中使用它們更安全。例如,如果ID為10的客戶透過http://www.example.com/customers/10/URL 存取其帳戶,則很容易猜到有客戶11,12等,這可能是攻擊的目標。
    03.可以在避免往返資料庫伺服器的任何地方產生UUID值。它還簡化了應用程式中的邏輯。例如,要將資料插入父表和子表,您必須先插入父表,取得產生的ID,然後將資料插入子表。透過使用UUID,您可以預先產生父表的主鍵值,並在交易中同時將資料列插入父表和子表。


UUID值也有一些缺點:

    01.儲存UUID值(16位元組)比整數(4位元組)或甚至大整數(8位元組)佔用更多儲存空間。
    02.調試似乎更難,想像一下表達WHERE id = ‘df3b7cb7-6a95-11e7-8846-b05adad3f0ae’ 而不是WHERE id = 10
    03.使用UUID值可能會導致效能問題,因為它們的大小和沒有被排序。


MySQL UUID範例

我們來看一個使用UUID作為主鍵的範例。 

以下語句建立一個名為的新表people:

CREATE TABLE people (
    id BINARY(16) PRIMARY KEY,
    name VARCHAR(255)
); 

若要插入 UUID值入id列,使用UUID()與UUID_TO_BIN()功能如下:

INSERT INTO people(id, name)
VALUES(UUID_TO_BIN(UUID()),'John Doe'),
      (UUID_TO_BIN(UUID()),'Will Smith'),
      (UUID_TO_BIN(UUID()),'Mary Jane'); 

==================


    所以,即使在表格內已有 UUID,一般還是會建議在 MySQL 中另外建立一個 column ,使用 unsigned int + auto_increment 做 primary key,一方面可以穩定 insertion speed,另一方面讓索引的查詢更快、分布平均、也讓索引更小。


MySQL 建立一張 使用BIGINT 為 unsigned int + auto increment 的資料表 範例(copilot提供)

CREATE TABLE Users (
    user_id BIGINT UNSIGNED AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(255) NOT NULL,
    PRIMARY KEY (user_id)
);


PS 

01.mysql bigint unsigned max value:0 to 18446744073709551615 ( 184兆兆)


02.mysql uuid 組合數量 3.4×10^38 ( 340 兆兆)

One thought on “MySQL UUID與INT自增作為主鍵比較

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *