首頁  >  文章  >  資料庫  >  MySQL 使用自增ID主鍵和UUID 作為主鍵的優劣比較詳細過程(從百萬到千萬表記錄測試)

MySQL 使用自增ID主鍵和UUID 作為主鍵的優劣比較詳細過程(從百萬到千萬表記錄測試)

黄舟
黄舟原創
2017-02-16 11:35:541762瀏覽

 

測試緣由

 

一個,他說不一定高,我說innodb的索引特性導致了自增id做主鍵是效率最好的,為了拿實際的案例來說服他,所以準備做一個詳細的測試。

 

作為互聯網公司,一定有用戶表,而且用戶表UC_USER基本上會有百萬記錄,所以在這個表基礎上準測試數據來進行測試。

 

         測試過程是目前我想到的多方位的常用的幾種類型的sql進行測試,當然可能不太完善,歡迎評論。

 

 

 

1、準備表以及資料

UC_USER,自增ID為主鍵,表結構類似如下:

CREATE TABLE `UC_USER` (
   `ID` bigint(20) NOT NULL AUTO_INCREMENT bigint(20) NOT NULL AUTO_INCREMENT bigint(20) NOT NULL AUTO_INCREMENT bigint(20) NOT NULL AUTO_INCREMENT  `USER_NAME` varchar(100) DEFAULT NULL COMMENT '使用者名稱', `USER_PWD` varchar(200) DEFAULT NULL COMMENT '密碼',    `BIRTHDAY` datetime DEFAULT NULL COMMENT '生日'姓名',    `USER_ICON` varchar(500) DEFAULT NULL COMMENT '頭像圖片',    `SEX` char(1) DEFAULT NULL COMMENT '性別, 1:男,2:女,3:保密', `STAT` varchar(10) DEFAULT NULL COMMENT '使用者狀態,01:正常,02:凍結',    `USER_MALL` bigint(20) DEFAULT NULL `USER_MALL` bigint(20) DEFAULT NULL `USER_MALL` bigint(20) DEFAULT NULL COMM NULL  DEFAULT NULL COMMENT '最後登入時間',
   `LAST_LOGIN_IP` varchar(100) DEFAULT NULL COMMENT '最後登入IP',
   `SRC_OPEN_USER_ID`bigbigint(c努), N `EMAIL` varchar(200) DEFAULT NULL COMMENT '郵箱',
   `MOBILE` varchar(50) DEFAULT NULL COMMENT '手機',
   `IS_DEL` char(1) DEFAULT 'EMA ) DEFAULT '0' COMMENT '是否有綁定信箱',
   `IS_PHONE_CONFIRMED` char(1) DEFAULT '0' COMMENT '是否綁定手機',
   ` (200),7(20),7]  ATE` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '註冊時間',
   `UPDATE_DATE` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '修改日期',
   `PWD_INTENSITY``(M LE_TGC` char(64) DEFAULT NULL COMMENT '手機登入標識',
   `MAC` char(64) DEFAULT NULL COMMENT 'mac位址',
   `SOURCE` char(1) DEFAULT '0' COMMENT¡管理系統, 0:未知',
   `ACTIVATE` char(1) DEFAULT '1' COMMENT '激活,1:激活,0:未啟動',
   `ACTCOMATE_TYPE`charULT) ,0:自動,1:手動',
   PRIMARY KEY (`ID`),
   UNIQUE KEY `USER_NAME` (`USER_NAME`),🠎  `USER_NAME` (`USER_NAME`),🠎  `USER_NAME` (`USER_NAME`),🠎  X_MOBILE_TGC` (`MOBILE_TGC `,`ID`),
   KEY `IDX_EMAIL` (`EMAIL`,`ID`),
   KEY `IDX_CREATE_DATE` (`害
 ) ENGINE =InnoDB AUTO_INCREMENT=7122681 DEFAULT CHARSET=utf8 COMMENT='使用者表'




 

 

 

UC_USER_PK_VARCHAR表,字串ID為主鍵,採用uuid

🎠178585%  `ID` varchar(36) CHARACTER SET utf8mb4 NOT NULL DEFAULT '0' COMMENT '

主鍵
',    `USER_NAME` varchar(100) DEFAULT NULL COMMENT '用戶名', '密碼',    `BIRTHDAY` datetime DEFAULT NULL COMMENT '生日',    `NAME` varchar(200) DEFAULT NULL COMMENT '姓名',    `USER_ICON` varchar(500) 對FAULT  `USER_ICON` varchar(500) COM FAULT NULL COMMENT '性別, 1:男,2:女,3:保密',
   `NICKNAME` varchar(200) DEFAULT NULL COMMENT '暱稱',
   `STAT` varchar(10)與暱稱',
   `STAT` varchar(10),c08FAULT.N
   `USER_MALL` bigint(20) DEFAULT NULL COMMENT `USER_MALL` bigint(20) DEFAULT NULL COMMENT `「目前所屬MALL',
   `LAST_LOGIN_DATE` date」 varchar(100) DEFAULT NULL COMMENT '最後登入IP',
   ` 。 COMMENT '手機',
   `IS_DEL` char(1) DEFAULT '0' COMMENT '是否刪除',
   `IS_EMAIL_CONFIRMED` char(1) DEFAULT '0' COMMENT '是否綁定信箱',,77% COMMENT '是否綁設定手機',
   `CREATER` bigint(20) DEFAULT NULL COMMENT '創建者',
   `CREATE_DATE` datetime DEFAULT CURRENT`D)註冊時間datetime DEFAULT CURRENT_TIMESTAMP COMMENT '修改日期',
   `PWD_INTENSITY` char(1) DEFAULT NULL COMMENT '密碼強度',
   `MOBILE_TGC` char(64) DEFAULT NULL COMMENT '手機識別   `SOURCE` char (1) DEFAULT '0' COMMENT '1:WEB,2:IOS,3:ANDROID,4:WIFI,5:管理系統, 0:未知',
   `ACTIVATE` char(1) 指定FAULT '1' ,1:激活,0:未啟動',
   `ACTIVATE_TYPE` char(1) DEFAULT '0' COMMENT '啟動類型,0:自動,1:手動',
  集USER_NAME` (`USER_NAME`),
   KEY `MOBILE` (`MOBILE`),
   KEY `IDX_MOBILE_TGC` (`MOBILE_TGC``ID),`( `),
KEY `IDX_CREATE_DATE` (`CREATE_DATE`,`ID`),
   KEY `IDX_UPDATE_DATE` (`UPDATE_DATE`)
 )COMfENGINE=InnoDB -8 

 

 

 

 

2、500W.0數據,自增

ID

節省一半磁碟空間確定兩個表資料量# 自增id為主鍵的表mysql> select count(1) from UC_USER;

+----------+

| count(1| ) |+----------+

|   5720112 |

+----------+

1 row in set (0.00 sec)

sql

 

1 row in set (0.00 sec)

sql

 

>

 

# uuid為主鍵的表

mysql> select count(1) from  UC_USER_PK_VARCHAR_1;

+----------+

| count(1)

+----------+

| count(1)-- --------+

|   5720112 |

+----------+

1 row in set (1.91 sec)

 來看,自增ID比UUID小一半左右。

主鍵型

蒟UUID-5 11 UC_USER_PK_VARCHAR_1.ibd5.4 G  相差不大
資料檔案大小

-rw-rw---- 1 mysql mysql 2.5G Aug 11  18:29 UC_USER.ibd

2.5 G

 

uu

2.2個增加
 

主鍵型

SQL語句執行時間(秒)

_CA. FROM  test.`UC_USER` t WHERE t .`MOBILE` ='14782121512'; SELECT SQL_NO_CACHE t.* FROM  test.`UC_USER_PK_VARCHAR_1` t WHERE t.`MOBILE` ='14782121512';0.117  自增IDSELECT SQL_NO_CACHE t.* FROM test.`UC_USER` t WHERE t.`MOBILE` IN( '14782121512','13761460105');0.049🜎 CHE t.* FROM  test.`UC_USER_PK_VARCHAR_1` t WHERE t.`MOBILE`  IN('14782121512','13761460105');0.040

0.118

 

 

 

UUID

 

 

 

自增ID

SELECT SQL_NO_CACHE t.* FROM  test.`UC_USER` t WHERE t.`CREATE_DATE`='2013-11-24 10:26:36' ;

0.139🜎

SELECT SQL_NO_CACHE t.* FROM  test.`UC_USER_PK_VARCHAR_1` t WHERE t.`CREATE_DATE`='2013-11-24 10:26:43' ;
0.126

🎟

 

 

 

2.3 範圍like 主鍵型

SQL語句 1.784SELECT SQL_NO_CACHE ttest. 自增IDSELECT  SQL_NO_CACHE t.* FROM test.`UC_USER_PK_VARCHAR_1` t WHERE t.* FROM_DATE`UC_USER_PK_VARCHAR_1` t WHERE t.`6:DATE`. `UPDATE_DATE` DESC LIMIT 200;🜎 _NO_CACHE COUNT(1) FROM  test.` UC_USER` t WHERE t.`CREATE_DATE` > '2016-07-01 10:26:36'  ;0.514 (1) FROM test.`UC_USER_PK_VARCHAR_1 ` t WHERE  t.`CREATE_DATE` > '2016-07-01 10:26:36'   ;

 

 

 

PS:在有快取的情況下,兩者執行效率並沒有差異很小。

 

 

 

2.4 寫入測試,自增ID 主鍵型

執行時間(秒)

(0

SELECT SQL_NO_CACHE t.* FROM  test.`UC_USER` t WHERE t.`MOBILE` LIKE '147%' LIMIT 1000;
1.784

 SQL_NO_CACHE t.* FROM test. `UC_USER_PK_VARCHAR_1` t WHERE t.`MOBILE` LIKE  '147%' LIMIT 1000;

3.196

自增ID

SELECT SQL_NO_CACHE t.* FROM  test.`UC_USER` t WHERE t.`CREATE_DATE` > '2016-08-01 10:265:7 LIMIT 20;

0.601

UUID

SELECT SQL_NO_CACHE t. -08-01 10:26:36' ORDER BY t.`UPDATE_DATE` DESC LIMIT 20;

0.543

SELECT SQL_NO_CACHE t.* FROM  test.`UC_USER` t WHERE t.`CREATE_DATE` > '2016-07-01 10:26:36' ORDER BY  t.`UPDATE_DATE`me

UUID

3.229

 

範圍查詢總數,自增ID比UUID

____CA

1.092

1.092

SQL語句 _ . LE_TGC`='T2' WHERE t. `CREATE_DATE` > '2016-05-03 10:26:36' AND  t.`CREATE_DATE` ID, c RTHDAY`,   `NAME`,    `USER_ICON`,   `SEX `,   `NICKNAME`,   `STAT`,    `USER_MALL`,    `LAST_LOGIN_DATE`,    `LAST_LOGIN_IP`, _DEL`,    `IS_EMAIL_CONFIRMED`,    `IS_PHONE_CONFIRMED`,    `CREATER`, `CREATE_DATE`,   `UPDATE_DATE`,   `PWD_INTENSITY`,   `MOBILE_TGC`,   `MAC`,    `SOURCE`, ELECT/JIVATE``5,``IV  CONCAT('110',`USER_NAME`,8),   `USER_PWD `,   `BIRTHDAY`,   `NAME`,    `USER_ICON`,   `SEX`,   `NICKNAME`,   `STAT`,   `USER_MALL`LOG,``]   `SRC_OPEN_USER_ID`,   `EMAIL`,  CONCAT('110 ',TRIM(`MOBILE`)),    `IS_DEL`,    `IS_EMAIL_CONFIRMED`,    `IS_PHONE_CONFIRMED`,    ` `MOBILE_TGC`,   `MAC`,    `SOURCE`, `ACTIVATE`,   `ACTIVATE_TYPE` FROM `test`.`UC_USER_1`  LIMIT 100;0.105ID UUID

 

 

自增ID

UPDATE test.`UC_USER` t SET t.`MOBILE_TGC`='T2'  WHERE t.`CREATE_DATE` > '2016-05-03 10:26:36'

1.419  

UUID

UUID

 

 

自增ID

0.105

插入測試。 `UC_USER_PK_VARCHAR_1`(     ID,   `USER_NAME`,   `USER_PWD`,  KNAME`,   `STAT`,    `USER_MALL`,    ` LAST_LOGIN_D ATE `、    `LAST_LOGIN_IP`、    `SRC_OPEN_USER_ID`、    `電子郵件`、   `移動`、   `IS_DEL`、   `CREATE_DATE`、   `UPDATE_D ATE`、`PWD_INTENSITY `、` MOBILE_TGC ` ,   `MAC`,    `SOURCE`,   `ACTIVATE`,   `ACTIVATE_TYPE` ) SELECT         `生日`,   `NAME`,    ` USER_ICON ` ,   `性別`,   `暱稱`,   `STAT`,    `USER_MALL`,  `LAST_LOGIN_DATE`,   `LAST_LOGIN_IP`, ) 電子郵件(移動`)), ` IS_DEL`、   `IS_EMAIL_CONFIRMED`、   `IS_PHONE_CONFIRMED`、    `CREATER`、   `CREATE_DATE      `SOURCE`、   `ACTIVATE`、   `ACTIVATE _TYPE``測試`。

性能梯度

主鍵型

SQL語句

Mysqldump備援31.08秒自增IDUUID  

自增ID

時間mysqldump -utim -ptimgood -h192.168.121.63 測試UC_USER_500> UC_USER_500.sql

28.59秒

時間mysqldump - utim -ptimgood -h192.168.121.63測試UC_USER_PK_VARCHAR_500 > UC_USER_PK_VARCHAR_500.sql

SQL

時間mysql -utim -ptimgood -h192.168.121. 63 測試

7m36.601s

時間測試表.sql

9公尺42.472秒

 

 

 

 

 

 

 

 

 

 

 

3500W3

500W

1

      普通單一或20條左右的記錄檢索,uuid為主鍵的差異不大幾乎效率相同;

(2)      但是範圍查詢特別是上百成千條的記錄查詢,自增id的效率要大於uuid;

(3)      範圍在範圍內做統計匯總的時候查詢統計匯總的時候查詢統計匯總查詢統計匯總查詢的時間進行統計匯總查詢,自增id的效率大於uuid;

(4)      在儲存上方,自增id所佔的儲存空間是uuid的1/2;

(5)     於UUID。

 

 

 

41000W 資料記錄,看儲存空間

# 自增

id為主鍵的表

mysql> use test;Database changedmysql> select count(1) from UC_USffdmysql> select count(1) from UC_USER_ER_1; | count(1) |

+----------+

| 10698102 |

+----------+

1 row in set (27.42 sec)

 

# uuid

為主鍵的表

mysql> select count(1) from  UC_USER_PK_VARCHAR_1

-- +----------+

| 10698102 |+----------+1 row in set (0.00 sec)

 

mysql>

 

mysql>

mysql>

mysql>

mysql>

  自增ID-rw-rw---- 1 mysql mysql 4.2G Aug 20  23:08UC_USg UUID-rw-rw---- 1 mysql mysql 8.8G Aug 20  18:20 UC_USER_PK_VARCHAR_1.ibd

佔據的空間容量來看,自增ID比UUID小一半左右:

佔據容量 

8.8 GCHAR_1.ibd

8.8 G

 

 

 

4.2 單一資料走索引查詢,自增id) 主鍵型

SQL語句執行時間(秒)0.0690.050. 0.810

自增ID

SELECT SQL_NO_CACHE t .* FROM  test.`UC_USER_1` t WHERE t.`MOBILE` ='14782121512';

🜎 test.`UC_USER_PK_VARCHAR_1` t WHERE t .`MOBILE` SELECT SQL_NO_CACHE t.* FROM  test.`UC_USER_1` t WHERE t.`MOBILE` IN( '14782121512','13761460105');

_CAp. .`UC_USER_PK_VARCHAR_1` t WHERE t.`MOBILE `  IN('14782121512','13761460105');

0.151

SELECT SQL_NO_CACHE t.* FROM  test.` UC_USER_1` t WHERE t.`CREATE_DATE`='2013-11-24 10:26:36' ;

0.269

 test.`UC_USER_PK_VARCHAR_1` t WHERE t.`CREATE_DATE`='2013-11-24 10:26:43' ;

 

 

 

4.3 範圍like (1.5~2)1 主鍵型

SQL語句SQL語句(1)模糊範圍查詢1000條數據,自增ID效能優於UUID自增IDUUIDSELECT  SQL_NO_CACHE t.* FROM test.`UC_USER_PK_VARCHAR_1` t WHERE t.`MOBILE` LIKE (2 )日期範圍查詢20個數據,自增ID稍微弱於UUID自增IDSELECT SQL_NO_CACHE t.* FROM ATE7.`UC_USER_`. 08-01 10:26:36' ORDER BY  t.`UPDATE_DATE` DESC LIMIT 20;0.7651.090(3)範圍查詢200條數據,自增ID效能優於UUID自增IDSELECT SQL_NO_CACHE t.* FROM  test.`UC_USER_1` t WHERE t.`CREATE_DATE FROM  test.`UC_USER_1` t WHERE t.`CREATE. ' ORDER BY  t.`UPDATE_DATE` DESC LIMIT 200;1.569UUID_Ftest自增IDSELECT SQL_NO_CACHE COUNT(1) FROM  test.`UC_USER_1` t WHERE t.`CREATE_DATE` > '2016-07-01 10:26:36' .

SELECT SQL_NO_CACHE t.* FROM  test.`UC_USER` t WHERE t.`BILE` KE '147%。 98

 

 test.`UC_USER_PK_VARCHAR_1` t WHERE t .`CREATE_DATE` > '2016-08-01  10:26:36' ORDER BY t.`UPDATE_DATE` DESC LIMIT 20;

 

UUID_Ftest; CHAR_1` t WHERE t.`CREATE_DATE`  > '2016- 07-01 10:26:36' ORDER BY t.`UPDATE_DATE` DESC LIMIT 200;
2.597

U

UUID

SELECT  SQL_NO_CACHE COUNT(1) FROM test.`UC_USER_PK_VARCHAR_1` t WHERE  t.`CREATE_DATE` > '2016-07-01 1 302

 

 

 

4.4 寫入測試,自增ID. 1 主鍵型

 UUID錄入資料自增ID0.534UUID

SQL語句

執行時間(秒)

執行時間(秒)

修改一天的記錄

自增ID

UPDATE test.`UC_USER_1` t SET  t.`MOBILE_TGC`='T2' WHERE t.`CREATE_DATE` > '2016-05-03 10:26:3CREATE_DATE` > '2016-05-03 10:26:3)
2.685

UUID

__h LE_TGC`='T2' WHERE t. `CREATE_DATE` > '2016-05-03 10:26:36' AND  t.`CREATE_DATE`

INSERT INTO test.`UC_USER_1`(   ID,    `USER_NAME`, ER_  `USER_ICON`,   `SEX`,   `NICKNAME `,   `STAT`,    `USER_MALL`,    `LAST_LOGIN_DATE`,   `LAST_LOGIN_IP`,   `SRC_OPEN_USER_ID`, _CONFIRMED`,   `IS_PHONE_CONFIRMED`,   `CREATER`,   `CREATE_DATE`, `UPDATE_DATE`,   `PWD_INTENSITY`,   `MOBILE_TGC`,   `MAC`,    `SOURCE`,   `ACTIVATE`,   `IVATE_TYPE` _NAME`,8),   `USER_PWD`,   `BIRTHDAY `,   `NAME`,    `USER_ICON`,   `SEX`,   `NICKNAME`,   `STAT`,    `USER_MALL`, AST/RC_`LAST_LOGIN_DATE, ER_ID`,   `EMAIL`,  CONCAT('110',TRIM( `MOBILE`)),   `IS_DEL`,   `IS_EMAIL_CONFIRMED`,   `IS_PHONE_CONFIRMED`,   `CREATER`,      `MAC`,    `SOURCE`,   `ACTIVATE`, `ACTIVATE_TYPE` FROM `test`.`UC_USER_1`  LIMIT 100;

UUID

插入測試。 AME`,   `STAT`,    `USER_MALL`,    ` LAST_LOGIN_D ATE `、    `LAST_LOGIN_IP`、    `SRC_OPEN_USER_ID`、   `電子郵件`、   `行動`、    `IS_DEL`、PH. `CREATE_DATE`、   `UPDATE_DATE` ,   `PWD_INTENSITY `,   `MOBILE_TGC ` ,   `MAC`,    `SOURCE`,   `ACTIVATE`,   `ACTIVATE_TYPE` ) SELECT         UUID(),`ER CONCAT(``10, CONCAT,``US ER),``70785_``7),``70078,70788585_`FER_`FER) 207858 ,   `NAME`,    `USER_ICON ` ,   `性別`,   `暱稱`,   `STAT`,    `USER_MALL`,    `LAST_LOGIN_DATE`,    `LAST_LOGIN_IP`, )_``,    `LAST_LOGIN_IP`. (`移動`)),    ` IS_DEL ` ,    `IS_EMAIL_CONFIRMED`,    `IS_PHONE_CONFIRMED`,    `CREATER`,   `     `SOURCE`,   `ACTIVATE`,   `ACTIVATE_TYPE`測試`。 UC_USER_1`  LIMIT 100;

1.716

 

 

  . ID 性能梯度UUID

時間mysqldump -utim -ptimgood -h192.168.121.63 測試UC_USER_1>UC_USER_1.sql0m50.548smy0m58.590s17m30.822s   測試產生ID的測試類,IdWorkerTest.java:

主鍵類型

SQL語句

執行時間(秒)

備份

自增ID

my

0m50.548s
好-h192.168.121.63 測試UC_USER_PK_VARCHAR_1 > UC_USER_PK_VARCHAR_1.sql

 

時間mysql -utim -ptimgood -h192.168.121.63

UUID

23公尺6.360秒

 

 

 

 

51000W00

記錄

1000W001或單條的單次記錄

的記錄檢索,自增主鍵效率是uuid主鍵的2到3倍;

(2)但是範圍查詢特別是上百成千條的記錄查詢,自增id的效率要大於uuid;

(3)在範圍查詢做統計匯總的時候,自增id主鍵的效率是uuid主鍵1.5到2倍;

(4)在儲存上面,自增id所佔的儲存空間是uuid的1/2;

(5)在寫入上面,自增ID主鍵的效率是UUID主鍵的3到10倍,相差比較明顯,特別是update小範圍內的資料上面。

(6)在備份恢復上,自增ID主鍵稍微優於UUID。

 

 

 

6MySQL分佈式架構的取元工具這時候普通的單表自增ID主鍵就不太合適,因為多個mysql實例上會遇到主鍵全域唯一性問題。  

 

 

6.1

、自增

ID主鍵,          在每個群集節點組的master上面,設定(auto_increment_increment),讓目前每個集群的起始點錯開1,步長選擇大於將來基本上不可能達到的切分集群數,達到將ID 相對分段的效果來滿足全局唯一的效果。  優點是:實現簡單,後期維護簡單,對應用透明。

 

缺點是:第一次設定相對較為複雜,因為要針對未來業務的發展而計算好足夠的步長

;

N個節點組,那麼第i個節點組的my.cnf的配置為:

auto_increment_offset  i

auto_increment_increment  N

 

如同一個節點規劃為假如同一個節點,N這個i為8,第8個節點組的my.cnf裡面的配置為:auto_increment_offset  8

auto_increment_increment  48

 

UUID

,適合小規模的分散式環境

         對於InnoDB這種聚集主鍵類型的引擎來說,資料會依照主鍵排序,由於UUID的無序性,InnoDB會產生龐大的IO壓力,而且由於索引和資料儲存在一起,字符串做主鍵會造成儲存空間增加一倍。

 

在儲存和檢索的時候,innodb會對主鍵進行物理排序,這對auto_increment_int是個好消息,因為後一次插入的主鍵位置總是在最後。但對uuid來說,這卻是個壞消息,因為uuid是雜亂無章的,每次插入的主鍵位置是不確定的,可能在開頭,也可能在中間,在進行主鍵物理排序的時候,勢必會造成大量的IO操作影響效率,在資料量不停成長的時候,特別是資料量上了千萬紀錄的時候,讀寫效能下降的非常厲害。

 

優點:搭建比較簡單,不需要為主鍵唯一性的處理。

缺點:佔用兩倍的儲存空間(在雲端上光儲存一塊就要多花

2

倍的錢),後期讀寫效能下降厲害。

    

6.3

.分散式id演算法snowflake(Java版本)

 

IdWorker.java:

 

.com slf4j.LoggerFactory;

public class IdWorker {

   

     受保護的靜態最終Logger LOG =  LoggerFactory.getLogger(IdWorker.class);

    

    私有長序列= 0L;

 

     私人長twepoch = 1288834974657L;

     私有長workerIdBits = 5L;

     私有長datacenterIdBits = 5L;

   私有長maxDatacenterId = -1L ^ (-1L

     私有長sequenceBits = 12L;

 

     

    私有長timestampLeftShift =sequenceBits +workerIdBits + datacenterIdBits;

     私有長sequenceMask = -1L ^ (-1L  

     private long lastTimestamp = -1L;

 

.      // 對workerId

進行健全性檢查

         若( workerId > ||workerId             throw new  IllegalArgumentException(String.format("worker  );

         如果(資料中心ID>最大值資料中心ID ||資料中心ID              拋出new IllegalArgumentException(String.format("資料中心ID 不能大於%d 或小於       this.workerId = workerId;

this.datacenterId = datacenterId;

        LOG.info(String.format("worker 開始。時間戳左移%d,資料中心ID 位元%d,worker ID 位元%d,序列位元%d,workerid %d",timestampLeftShift,datacenterIdBits,workerIdBits , sequenceBits,  workerId));同步long nextId() {

         long timestamp = timeGen();

 

         LOG.error(String. format("時鐘向後移動。拒絕請求直到%d。", lastTimestamp));

            throw new RuntimeException(String.format("時鐘向後移動。拒絕產生%d 毫秒的ID",lastTimestamp

         if (lastTimestamp == 時間戳) {

            序列= (序列+ 1) &  sequenceMask;

            if (序列== 0 ) {

                 時間戳=  tilNextMillis(lastTimestamp);

            }

         } else {

            序列= 0L;

}

 

         lastTimestamp = 時間戳;

 

      Id

    }

 

     受保護的long tilNextMillis(long lastTimestamp) {Gen    受保護的long tilNextMillis(long lastTimestamp) {Genhed);       while (timestamp

            時間戳 = timeGen();

         }

  

     受保護的long timeGen() {

         回 System.currentTimeMillis();

  

 

 

 

🜎 java.util.HashSet;

import java .util.Set ;

 public class IdWorkerTest {

            ; set;

         private IdWorker idWorker;

 

      set, IdWorker idWorker) {

            this.set = set;

       

 

         公共無效run() {

           Worker.nextId ();

                 System.out.println("            if (!set.add(id) ) {

                    System.out.println("重複:" + id);

🟜 }

            }

         }

     

         Set ; set = new HashSet();

         最終IdWorker idWorker1 = new IdWorker    最終IdWorker idWorker1 = new.Worker1 = new (0, 0);

         最終IdWorker idWorker2 = new IdWorker(1, 0);

             Thread t2 = new Thread(new  IdWorkThread(set , idWorker2));

         t1.setDaemon(true);

         t2.setDaemon(true); t2.start();

         嘗試{

            Thread.sleep(30000 );

         } catch (InterruptedException e) {

                }

}

 

 

 

7,總結

( W的單機表測試,自增ID相對UUID來說,自增ID主鍵效能高於UUID,磁碟儲存費用比UUID節省一半的錢。所以在單一實例上或單一節點群組上,使用自增ID作為首選主鍵。

 2

)分散式架構場景:

      效能而使用UUID主鍵快速部署;          20到200個節點組的中等規模的分散式場景,可採用自增ID+步長的較快速方案。  

         200以上節點組的大數據下的分散式場景,可參考類似twitter雪花演算法構造的全域自增ID作為主鍵。

 

 

 以上就是MySQL 使用自增ID主鍵和UUID 作為主鍵的優劣比較詳細過程(從百萬到千萬表記錄測試)的內容,更多相關內容請關注PHP中文網(www. php.cn)!

 

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn