MySQL 使用自增ID主鍵和UUID 作為主鍵的優劣比較詳細流程(500W單表)

黄舟
發布: 2017-02-16 11:37:13
原創
2665 人瀏覽過

 

 

測試緣由

 

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

 

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

 

 大概環境是:Centos6.5、MySQL5.6.12

 

 

,自增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    

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

|   5720112 |

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

1 row in set (1.91 sec)

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

主鍵型

資料檔案大小

蒟-5 11 UC_USER_PK_VARCHAR_1.ibd  uu

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

2.5 G

UUID

5.4 G

 

2.2個增加

 

相差不大

主鍵型

SQL語句

執行時間(秒)_CA. FROM  test.`UC_USER` t WHERE t .`MOBILE` ='14782121512';0.118

 UUIDSELECT SQL_NO_CACHE t.* FROM  test.`UC_USER_PK_VARCHAR_1` t WHERE t.`MOBILE` ='14782121512';0.117  自增ID🜎 CHE t.* FROM  test.`UC_USER_PK_VARCHAR_1` t WHERE t.`MOBILE`  IN('14782121512','13761460105');0.040  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` t WHERE t.`MOBILE` IN( '14782121512','13761460105');

0.049

自增ID

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. 自增IDUUID3.229🜎 _NO_CACHE COUNT(1) FROM  test.` UC_USER` t WHERE t.`CREATE_DATE` > '2016-07-01 10:26:36'  ;0.514

執行時間(秒)

(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`  DESC LIMIT 200;

2.314

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;

 

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

____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語句  自增ID0.105(1)一般單一或20筆左右的記錄查詢,uuid主鍵的外差不大幾乎相同效率;

 

 

自增ID

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

1.419  

UUIDATE

UUIDATE `MOBILE_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`,``7_`LALL``&FATE_`] RC_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

插入測試。 `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`  _DATE`、   `UPDATE_DATE`、   ` PWD_INTENSITY`,  `移動_TGC` ,   `MAC`,    `SOURCE`,   `ACTIVATE`,   `ACTIVATE_TYPE` ) SELECT         UUID(),   CONCAT(1110), `生日`,   `NAME`, `USER_ICON` ,   `性別`,   `暱稱`,   `STAT`,    `USER_MALL`,    `LAST_LOGIN_DATE`,   `LAST_LOGIN_`7_LOGIN_DATE`. 10',TRIM(`移動`)) ,    `IS_DEL ` ,    `IS_EMAIL_CONFIRMED`,    `IS_PHONE_CONFIRMED`,    `CREATER`,  ,   `MAC`,    `SOURCE`,   `ACTIVATE`,   `ACTIVATE_TYPE`測驗` 。

在500W記錄表的測試下:

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

(3)      在範圍查詢做統計總結的時候,自我增加id的效率大於uuid;

(4)      在上面,自增id所佔的錢包就是MySQL使用自增ID主鍵和UUID作為主鍵的優劣對比詳細過程(500W單表)的內容,更多相關內容請關注PHP中文網(www.php.cn)!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!