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小一半左右。
|
主鍵型
資料檔案大小
| 蒟-rw-rw---- 1 mysql mysql 2.5G Aug 11 18:29 UC_USER.ibd |
2.5 G
|
UUID
| -5 11 UC_USER_PK_VARCHAR_1.ibd
| 5.4 G |
|
uu 2.2個增加 |
|
相差不大
主鍵型
SQL語句執行時間(秒)
_CA. FROM test.`UC_USER` t WHERE t .`MOBILE` ='14782121512';
0.118 |
|
|
|
| UUID |
SELECT SQL_NO_CACHE t.* FROM test.`UC_USER_PK_VARCHAR_1` t WHERE t.`MOBILE` ='14782121512'; | 0.117 |
|
|
| |
| 自增ID | SELECT 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 | |
自增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語句
執行時間(秒) |
|
(0 SELECT SQL_NO_CACHE t.* FROM test.`UC_USER` t WHERE t.`MOBILE` LIKE '147%' LIMIT 1000; |
1.784
| 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 ttest.
SELECT SQL_NO_CACHE t. -08-01 10:26:36' ORDER BY t.`UPDATE_DATE` DESC LIMIT 20; |
0.543 |
| 自增ID
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
|
SELECT 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;
3.229
|
範圍查詢總數,自增ID比UUID | 🜎 _NO_CACHE COUNT(1) FROM test.` UC_USER` t WHERE t.`CREATE_DATE` > '2016-07-01 10:26:36' ; | 0.514
____CA | (1) FROM test.`UC_USER_PK_VARCHAR_1 ` t WHERE t.`CREATE_DATE` > '2016-07-01 10:26:36' ;
1.092 |
1.092 |
|
PS:在有快取的情況下,兩者執行效率並沒有差異很小。
2.4 寫入測試,自增ID 主鍵型
SQL語句
| |
|
自增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 | _ . LE_TGC`='T2' WHERE t. `CREATE_DATE` > '2016-05-03 10:26:36' AND t.`CREATE_DATE`
|
|
自增ID |
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.105 |
| 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``測試`。 | ID 性能梯度 | UUID
主鍵型
SQL語句
Mysqldump備援
自增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
|
31.08秒
SQL
| 自增ID
時間mysql -utim -ptimgood -h192.168.121. 63 測試 |
7m36.601s |
| UUID
時間測試表.sql |
9公尺42.472秒 |
|
|
|
|
|
|
|
|
|
3、500W3
、500W
1 普通單一或20條左右的記錄檢索,uuid為主鍵的差異不大幾乎效率相同;(2) 但是範圍查詢特別是上百成千條的記錄查詢,自增id的效率要大於uuid;(3) 範圍在範圍內做統計匯總的時候查詢統計匯總的時候查詢統計匯總查詢統計匯總查詢的時間進行統計匯總查詢,自增id的效率大於uuid;(4) 在儲存上方,自增id所佔的儲存空間是uuid的1/2;(5) 於UUID。
4、1000W 資料記錄,看儲存空間
# 自增
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比UUID小一半左右: |
|
佔據容量
|
自增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
8.8 GCHAR_1.ibd |
8.8 G
4.2 單一資料走索引查詢,自增id) 主鍵型
SQL語句
| 執行時間(秒)
自增ID |
SELECT SQL_NO_CACHE t .* FROM test.`UC_USER_1` t WHERE t.`MOBILE` ='14782121512'; |
0.069
🜎 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');
| 0.050
_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' ;
|
0.810
4.3 範圍like (1.5~2):1 主鍵型
SQL語句
| SQL語句
| (1)模糊範圍查詢1000條數據,自增ID效能優於UUID
| 自增ID
SELECT SQL_NO_CACHE t.* FROM test.`UC_USER` t WHERE t.`BILE` KE '147%。 98
|
UUID | SELECT SQL_NO_CACHE t.* FROM test.`UC_USER_PK_VARCHAR_1` t WHERE t.`MOBILE` LIKE |
| (2 )日期範圍查詢20個數據,自增ID稍微弱於UUID
| 自增ID | SELECT SQL_NO_CACHE t.* FROM ATE7.`UC_USER_`. 08-01 10:26:36' ORDER BY t.`UPDATE_DATE` DESC LIMIT 20; | 0.765
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;
|
1.090 |
| (3)範圍查詢200條數據,自增ID效能優於UUID |
自增ID | SELECT 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.569 |
UUID_Ftest
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
| 自增ID | SELECT SQL_NO_CACHE COUNT(1) FROM test.`UC_USER_1` t WHERE t.`CREATE_DATE` > '2016-07-01 10:26:36' .
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 主鍵型
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 |
|
UUID
__h LE_TGC`='T2' WHERE t. `CREATE_DATE` > '2016-05-03 10:26:36' AND t.`CREATE_DATE` |
| 錄入資料 |
自增ID
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;
|
0.534 |
UUID |
| 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
主鍵類型 |
SQL語句 |
執行時間(秒) |
備份
自增ID
|
時間mysqldump -utim -ptimgood -h192.168.121.63 測試UC_USER_1>UC_USER_1.sql | 0m50.548smy0m50.548s | my好-h192.168.121.63 測試UC_USER_PK_VARCHAR_1 > UC_USER_PK_VARCHAR_1.sql
|
0m58.590s
|
|
時間mysql -utim -ptimgood -h192.168.121.63 |
17m30.822s
UUID 我 |
23公尺6.360秒
| | |
|
|
|
5、1000W00
記錄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。
6、MySQL分佈式架構的取元工具這時候普通的單表自增ID主鍵就不太合適,因為多個mysql實例上會遇到主鍵全域唯一性問題。
6.1、自增
ID主鍵, 在每個群集節點組的master上面,設定(auto_increment_increment),讓目前每個集群的起始點錯開1,步長選擇大於將來基本上不可能達到的切分集群數,達到將ID 相對分段的效果來滿足全局唯一的效果。 優點是:實現簡單,後期維護簡單,對應用透明。
缺點是:第一次設定相對較為複雜,因為要針對未來業務的發展而計算好足夠的步長; N個節點組,那麼第i個節點組的my.cnf的配置為: auto_increment_offset iauto_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();
|
測試產生ID的測試類,IdWorkerTest.java:
🜎 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)!
|
|
|
|
|
|
|
|