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自增作為主鍵比較”
首先我們來看bigint, MySQL的整數型別有這樣幾種:
https://blog.csdn.net/qq_22771739/article/details/85833710
類型 占用BYTE數
tinyint -> 1(8bit)
smallint -> 2(16bit)
mediumint -> 3(24bit)
int -> 4(32bit)
bigint -> 8(64bit)