本文转载自微信公众号《Java极客技术》,作者鸭血范。转载本文请联系Java极客技术公众号。1.总结在日常开发中,数据库中生成主键id的方法主要有3种。数据库自增ID使用随机数生成不重复的ID。使用jdk提供的uuid。对于这三种方案,我发现在数据量较小的时候,并没有特别的区别,但是当单表的数据量达到百万级以上时,它们的性能就有明显的差异。光有理论是不够的,还得靠实际程序测试。今天,小编就带大家一探究竟!2、程序示例首先,我们在本地数据库中创建三张单表tb_uuid_1、tb_uuid_2、tb_uuid_3,并将tb_uuid_1表的主键设置为自增长模式。脚本如下:CREATETABLE`tb_uuid_1`(`id`bigint(20)unsignedNOTNULLAUTO_INCREMENT,`name`varchar(20)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_unicode_ciCOMMENT='主键IDself-生长';CREATETABLE`tb_uuid_2`(`id`bigint(20)unsignedNOTNULL,`name`varchar(20)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_unicode_ciCOMMENT='主键ID随机数生成';CREATETABLE`tb_uuid_3`(`id`varchar(50)NOTNULL,`name`varchar(20)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_unicode_ciCOMMENT='主键由uuid生成';接下来我们使用Springboot+mybatis来实现插入测试。2.1.数据库自增以数据库自增为例,先写各种实体和数据持久层操作,方便后续测试/***表实体*/publicclassUUID1implementsSerializable{privateLongid;privateStringname;//省略set,get}/***数据持久层操作*/publicinterfaceUUID1Mapper{/***自增长插入*@paramuuid1*/@Insert("INSERTIINTOtb_uuid_1(name)VALUES(#{name})")voidinsert(UUID1uuid1);}/***Auto-增量ID,单元测试*/@TestpublicvoidtestInsert1(){longstart=System.currentTimeMillis();for(inti=0;i<1000000;i++){uuid1Mapper.insert(newUUID1().setName("张三"));}longend=System.currentTimeMillis();System.out.println("花费的时间:"+(end-start));}2.2。使用随机数生成ID这里我们使用twitter的雪花算法实现随机ID工具类如下:publicclassSnowflakeIdWorker{privatestaticSnowflakeIdWorkerinstance=newSnowflakeIdWorker(0,0);/***开始时间cutoff(2015-01-01)*/privatefinallongtwepoch=1420041600000L;/***机器id占用的位数*/privatefinallongworkerIdBits=5L;/***数据标识符id占用的位数*/privatefinallongdatacenterIdBits=5L;/***最大支持的机器id,结果为31(这个移位算法可以快速算出几个二进制数所能表示的最大十进制数)*/privatefinallongmaxWorkerId=-1L^(-1L<
