MySQL 使用自增ID主键和UUID 作为主键的优劣比较详细过程(从百万到千万表记录测试)

本文通过500W和1000W数据测试,对比了MySQL中自增ID与UUID作为主键的优劣。测试结果显示,自增ID在磁盘空间、查询性能、写入速度和备份恢复上优于UUID,尤其在大数据量时优势更明显。在分布式场景下,自增ID+步长、UUID和雪花算法各有适用范围。
摘要由CSDN通过智能技术生成
               

 

测试缘由

 

 一个开发同事做了一个框架,里面主键是uuid,我跟他建议说mysql不要用uuid用自增主键,自增主键效率高,他说不一定高,我说innodb的索引特性导致了自增id做主键是效率最好的,为了拿实际的案例来说服他,所以准备做一个详细的测试。

 

 作为互联网公司,一定有用户表,而且用户表UC_USER基本会有百万记录,所以在这个表基础上准测试数据来进行测试。

 

         测试过程是目前我想到的多方位的常用的几种类型的sql进行测试,当然可能不太完善,欢迎大家留言提出更加完善的测试方案或者测试sql语句。

 

 

 

1、准备表以及数据

UC_USER,自增ID为主键,表结构类似如下:

CREATE TABLE `UC_USER` (
    `ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
    `USER_NAME` varchar(100) DEFAULT NULL COMMENT '用户名',
    `USER_PWD` varchar(200) DEFAULT NULL COMMENT '密码',
    `BIRTHDAY` datetime DEFAULT NULL COMMENT '生日',
    `NAME` varchar(200) DEFAULT NULL COMMENT '姓名',
    `USER_ICON` varchar(500) DEFAULT NULL COMMENT '头像图片',
    `SEX` char(1) DEFAULT NULL COMMENT '性别, 1:男,2:女,3:保密',
    `NICKNAME` varchar(200) DEFAULT NULL COMMENT '昵称',
    `STAT` varchar(10) DEFAULT NULL COMMENT '用户状态,01:正常,02:冻结',
    `USER_MALL` bigint(20) DEFAULT NULL COMMENT '当前所属MALL',
    `LAST_LOGIN_DATE` datetime DEFAULT NULL COMMENT '最后登录时间',
    `LAST_LOGIN_IP` varchar(100) DEFAULT NULL COMMENT '最后登录IP',
    `SRC_OPEN_USER_ID` bigint(20) DEFAULT NULL COMMENT '来源的联合登录',
    `EMAIL` varchar(200) DEFAULT NULL COMMENT '邮箱',
    `MOBILE` varchar(50) DEFAULT NULL COMMENT '手机',
    `IS_DEL` char(1) DEFAULT '0' COMMENT '是否删除',
    `IS_EMAIL_CONFIRMED` char(1) DEFAULT '0' COMMENT '是否绑定邮箱',
    `IS_PHONE_CONFIRMED` char(1) DEFAULT '0' COMMENT '是否绑定手机',
    `CREATER` bigint(20) DEFAULT NULL COMMENT '创建人',
    `CREATE_DATE` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间',
    `UPDATE_DATE` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '修改日期',
    `PWD_INTENSITY` char(1) DEFAULT NULL COMMENT '密码强度',
    `MOBILE_TGC` char(64) DEFAULT NULL COMMENT '手机登录标识',
    `MAC` char(64) DEFAULT NULL COMMENT 'mac地址',
    `SOURCE` char(1) DEFAULT '0' COMMENT '1:WEB,2:IOS,3:ANDROID,4:WIFI,5:管理系统, 0:未知',
    `ACTIVATE` char(1) DEFAULT '1' COMMENT '激活,1:激活,0:未激活',
    `ACTIVATE_TYPE` char(1) DEFAULT '0' COMMENT '激活类型,0:自动,1:手动',
    PRIMARY KEY (`ID`),
    UNIQUE KEY `USER_NAME` (`USER_NAME`),
    KEY `MOBILE` (`MOBILE`),
    KEY `IDX_MOBILE_TGC` (`MOBILE_TGC`,`ID`),
    KEY `IDX_EMAIL` (`EMAIL`,`ID`),
    KEY `IDX_CREATE_DATE` (`CREATE_DATE`,`ID`),
    KEY `IDX_UPDATE_DATE` (`UPDATE_DATE`)
  ) ENGINE=InnoDB AUTO_INCREMENT=7122681 DEFAULT CHARSET=utf8 COMMENT='用户表'

 

 

 

UC_USER_PK_VARCHAR表,字符串ID为主键,采用uuid

CREATE TABLE `UC_USER_PK_VARCHAR_1` (
  `ID` varchar(36) CHARACTER SET utf8mb4 NOT NULL DEFAULT '0' COMMENT '主键',
    `USER_NAME` varchar(100) DEFAULT NULL COMMENT '用户名',
    `USER_PWD` varchar(200) DEFAULT NULL COMMENT '密码',
    `BIRTHDAY` datetime DEFAULT NULL COMMENT '生日',
    `NAME` varchar(200) DEFAULT NULL COMMENT '姓名',
    `USER_ICON` varchar(500) DEFAULT NULL COMMENT '头像图片',
    `SEX` char(1) DEFAULT NULL COMMENT '性别, 1:男,2:女,3:保密',
    `NICKNAME` varchar(200) DEFAULT NULL COMMENT '昵称',
    `STAT` varchar(10) DEFAULT NULL COMMENT '用户状态,01:正常,02:冻结',
    `USER_MALL` bigint(20) DEFAULT NULL COMMENT '当前所属MALL',
    `LAST_LOGIN_DATE` datetime DEFAULT NULL COMMENT '最后登录时间',
    `LAST_LOGIN_IP` varchar(100) DEFAULT NULL COMMENT '最后登录IP',
    `SRC_OPEN_USER_ID` bigint(20) DEFAULT NULL COMMENT '来源的联合登录',
    `EMAIL` varchar(200) DEFAULT NULL COMMENT '邮箱',
    `MOBILE` varchar(50) DEFAULT NULL COMMENT '手机',
    `IS_DEL` char(1) DEFAULT '0' COMMENT '是否删除',
    `IS_EMAIL_CONFIRMED` char(1) DEFAULT '0' COMMENT '是否绑定邮箱',
    `IS_PHONE_CONFIRMED` char(1) DEFAULT '0' COMMENT '是否绑定手机',
    `CREATER` bigint(20) DEFAULT NULL COMMENT '创建人',
    `CREATE_DATE` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间',
    `UPDATE_DATE` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '修改日期',
    `PWD_INTENSITY` char(1) DEFAULT NULL COMMENT '密码强度',
    `MOBILE_TGC` char(64) DEFAULT NULL COMMENT '手机登录标识',
    `MAC` char(64) DEFAULT NULL COMMENT 'mac地址',
    `SOURCE` char(1) DEFAULT '0' COMMENT '1:WEB,2:IOS,3:ANDROID,4:WIFI,5:管理系统, 0:未知',
    `ACTIVATE` char(1) DEFAULT '1' COMMENT '激活,1:激活,0:未激活',
    `ACTIVATE_TYPE` char(1) DEFAULT '0' COMMENT '激活类型,0:自动,1:手动',
    PRIMARY KEY (`ID`),
    UNIQUE KEY `USER_NAME` (`USER_NAME`),
    KEY `MOBILE` (`MOBILE`),
    KEY `IDX_MOBILE_TGC` (`MOBILE_TGC`,`ID`),
    KEY `IDX_EMAIL` (`EMAIL`,`ID`),
    KEY `IDX_CREATE_DATE` (`CREATE_DATE`,`ID`),
    KEY `IDX_UPDATE_DATE` (`UPDATE_DATE`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';

 

 

 

 

2、500W数据测试

2.1 录入500W数据,自增ID节省一半磁盘空间

确定两个表数据量

# 自增id为主键的表

 

mysql> select count(1) from UC_USER;

 

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

 

| count(1) |

 

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

 

|   5720112 |

 

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

 

1 row in set (0.00 sec)

 

 

 

mysql>

 

 

 

# uuid为主键的表

 

mysql> select count(1) from  UC_USER_PK_VARCHAR_1;

 

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

 

| count(1) |

 

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

 

|   5720112 |

 

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

 

1 row in set (1.91 sec)

 

占据的空间容量来看,自增ID比UUID小一半左右。

           

主键类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值