MySQL中的UUID
2015-08-09 13:33
525 查看
避免主键冲突可以有多种方法,其中UUID比较方便而已。
以订单为例,假设有:中心A,中心B,中心C。。。服务器,各服务器均能独立产生订单。最终汇总到中心0服务器中。如果使用自增长主键就会在数据汇聚的时候产生冲突。
UUID可以很好地解决这个问题。
JAVA生成UUID
性能损失如图:
数据来源MySQL InnoDB Primary Key Choise
如 storing-billions-uuid-fields-mysql-innodb
这篇博文就有详细性能对比:
UUID - CHAR(36)
UUID - BINARY(16)
可以看出性能有了极大的提升。
该方法缺陷在于:主键数据在数据库管理工具中显示为乱码。
使用UUID
涉及分布式数据库间数据共享与同步的问题以订单为例,假设有:中心A,中心B,中心C。。。服务器,各服务器均能独立产生订单。最终汇总到中心0服务器中。如果使用自增长主键就会在数据汇聚的时候产生冲突。
UUID可以很好地解决这个问题。
JAVA生成UUID
UUID.randomUUID().toString().replaceAll("-","");
UUID的性能问题
由于MySQL的InnoDB类型表在插入数据的时候进行了逐渐排序。因此对于随机UUID在数据量大的时候会出现性能下降的情况性能损失如图:
数据来源MySQL InnoDB Primary Key Choise
提高MySQL中UUID查询性能的方法
很多文章中都提到了将UUID以binary形式存储可以显著提高性能。如 storing-billions-uuid-fields-mysql-innodb
这篇博文就有详细性能对比:
UUID - CHAR(36)
INSERT PERFORMANCE -------------------------------------------------------- total_rows chunk_size time_taken 100000 100000 1.87230491638 200000 100000 2.42642807961 300000 100000 3.65519285202 400000 100000 4.23701429367 500000 100000 4.88455510139 600000 100000 5.57620716095 700000 100000 7.50717425346 800000 100000 9.49350070953 900000 100000 10.1547751427 1000000 100000 12.0748021603 1100000 100000 12.277310133 1200000 100000 12.2819159031 1300000 100000 16.9854588509 1400000 100000 20.3873689175 1500000 100000 21.8642649651 1600000 100000 24.4224257469 1700000 100000 29.6857917309 1800000 100000 31.5416200161 1900000 100000 35.4671728611 2000000 100000 41.4726109505 SELECT PERFORMANCE -------------------------------------------------------- total_rows chunk_size time_taken 100000 10000 0.165283203125 200000 10000 0.163378000259 300000 10000 0.162928104401 400000 10000 0.164531946182 500000 10000 0.170125961304 600000 10000 0.167329072952 700000 10000 0.166491746902 800000 10000 0.174521684647 900000 10000 0.167996168137 1000000 10000 0.171768426895 1100000 10000 0.171753883362 1200000 10000 0.170397043228 1300000 10000 0.175933599472 1400000 10000 0.188637733459 1500000 10000 0.205511808395 1600000 10000 0.764106750488 1700000 10000 0.584647893906 1800000 10000 0.814380884171 1900000 10000 0.549372911453 2000000 10000 0.635137557983
UUID - BINARY(16)
INSERT PERFORMANCE -------------------------------------------------------- total_rows chunk_size time_taken 100000 100000 2.35787940025 200000 100000 1.5819132328 300000 100000 2.00737380981 400000 100000 2.36268806458 500000 100000 1.95024132729 600000 100000 2.52386879921 700000 100000 2.46662926674 800000 100000 3.63739991188 900000 100000 3.62550187111 1000000 100000 4.08164095879 1100000 100000 4.74432897568 1200000 100000 6.74240970612 1300000 100000 6.22160053253 1400000 100000 8.04201221466 1500000 100000 6.05508232117 1600000 100000 6.95644521713 1700000 100000 5.36873197556 1800000 100000 7.14802789688 1900000 100000 7.14896821976 2000000 100000 9.12283611298 SELECT PERFORMANCE -------------------------------------------------------- total_rows chunk_size time_taken 100000 10000 0.0722301006317 200000 10000 0.0698809623718 300000 10000 0.0726082324982 400000 10000 0.0731747150421 500000 10000 0.0735011100769 600000 10000 0.0744516849518 700000 10000 0.0759541988373 800000 10000 0.0766224861145 900000 10000 0.0773425102234 1000000 10000 0.0773928165436 1100000 10000 0.0789988040924 1200000 10000 0.0786738395691 1300000 10000 0.077996969223 1400000 10000 0.0804636478424 1500000 10000 0.0809540748596 1600000 10000 0.0811409950256 1700000 10000 0.081680059433 1800000 10000 0.0814859867096 1900000 10000 0.0813221931458 2000000 10000 0.0838458538055
可以看出性能有了极大的提升。
JPA中的具体表实体设置
参考文章Hibernate和UUID标示符该方法缺陷在于:主键数据在数据库管理工具中显示为乱码。
@Id @Column(columnDefinition = "BINARY(16)") private UUID uuid;
相关文章推荐
- MySQL中的integer 数据类型
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- MySQL存储过程
- 小心服务器内存居高不下的元凶--WebAPI服务
- Android IPC进程间通讯机制
- Android之获取手机上的图片和视频缩略图thumbnails
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- 运维入门
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv