MySQL 为啥不能用 UUID 做主键?
来自:博客园 | 作者:Yrion
前言
mysql程序实例 使用uuid和自增id的索引结构对比 总结
一、mysql和程序实例
1.1.要说明这个问题,我们首先来建立三张表
注:这里的随机key其实是指用雪花算法算出来的前后不连续不重复无规律的id:一串18位长度的long值



1.2.光有理论不行,直接上程序,使用spring的jdbcTemplate来实现增查测试:
package?com.wyq.mysqldemo;
import?cn.hutool.core.collection.CollectionUtil;
import?com.wyq.mysqldemo.databaseobject.UserKeyAuto;
import?com.wyq.mysqldemo.databaseobject.UserKeyRandom;
import?com.wyq.mysqldemo.databaseobject.UserKeyUUID;
import?com.wyq.mysqldemo.diffkeytest.AutoKeyTableService;
import?com.wyq.mysqldemo.diffkeytest.RandomKeyTableService;
import?com.wyq.mysqldemo.diffkeytest.UUIDKeyTableService;
import?com.wyq.mysqldemo.util.JdbcTemplateService;
import?org.junit.jupiter.api.Test;
import?org.springframework.beans.factory.annotation.Autowired;
import?org.springframework.boot.test.context.SpringBootTest;
import?org.springframework.util.StopWatch;
import?java.util.List;
@SpringBootTest
class?MysqlDemoApplicationTests?{
????@Autowired
????private?JdbcTemplateService?jdbcTemplateService;
????@Autowired
????private?AutoKeyTableService?autoKeyTableService;
????@Autowired
????private?UUIDKeyTableService?uuidKeyTableService;
????@Autowired
????private?RandomKeyTableService?randomKeyTableService;
????@Test
????void?testDBTime()?{
????????StopWatch?stopwatch?=?new?StopWatch("执行sql时间消耗");
????????/**
?????????*?auto_increment?key任务
?????????*/
????????final?String?insertSql?=?"INSERT?INTO?user_key_auto(user_id,user_name,sex,address,city,email,state)?VALUES(?,?,?,?,?,?,?)";
????????List<UserKeyAuto>?insertData?=?autoKeyTableService.getInsertData();
????????stopwatch.start("自动生成key表任务开始");
????????long?start1?=?System.currentTimeMillis();
????????if?(CollectionUtil.isNotEmpty(insertData))?{
????????????boolean?insertResult?=?jdbcTemplateService.insert(insertSql,?insertData,?false);
????????????System.out.println(insertResult);
????????}
????????long?end1?=?System.currentTimeMillis();
????????System.out.println("auto?key消耗的时间:"?+?(end1?-?start1));
????????stopwatch.stop();
????????/**
?????????*?uudID的key
?????????*/
????????final?String?insertSql2?=?"INSERT?INTO?user_uuid(id,user_id,user_name,sex,address,city,email,state)?VALUES(?,?,?,?,?,?,?,?)";
????????List<UserKeyUUID>?insertData2?=?uuidKeyTableService.getInsertData();
????????stopwatch.start("UUID的key表任务开始");
????????long?begin?=?System.currentTimeMillis();
????????if?(CollectionUtil.isNotEmpty(insertData))?{
????????????boolean?insertResult?=?jdbcTemplateService.insert(insertSql2,?insertData2,?true);
????????????System.out.println(insertResult);
????????}
????????long?over?=?System.currentTimeMillis();
????????System.out.println("UUID?key消耗的时间:"?+?(over?-?begin));
????????stopwatch.stop();
????????/**
?????????*?随机的long值key
?????????*/
????????final?String?insertSql3?=?"INSERT?INTO?user_random_key(id,user_id,user_name,sex,address,city,email,state)?VALUES(?,?,?,?,?,?,?,?)";
????????List<UserKeyRandom>?insertData3?=?randomKeyTableService.getInsertData();
????????stopwatch.start("随机的long值key表任务开始");
????????Long?start?=?System.currentTimeMillis();
????????if?(CollectionUtil.isNotEmpty(insertData))?{
????????????boolean?insertResult?=?jdbcTemplateService.insert(insertSql3,?insertData3,?true);
????????????System.out.println(insertResult);
????????}
????????Long?end?=?System.currentTimeMillis();
????????System.out.println("随机key任务消耗时间:"?+?(end?-?start));
????????stopwatch.stop();
????????String?result?=?stopwatch.prettyPrint();
????????System.out.println(result);
????}
1.3.程序写入结果



1.4.效率测试结果


二、使用uuid和自增id的索引结构对比
2.1.使用自增id的内部结构

2.2.使用uuid的索引内部结构

2.3.使用自增id的缺点
附:Auto_increment的锁争抢问题,如果要改善需要调优innodb_autoinc_lock_mode的配置
三、总结
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
关注网络尖刀微信公众号随时掌握互联网精彩
赞助链接
排名
热点
搜索指数
- 1 “反腐败没有选择 必须知难而进” 7904450
- 2 《今日说法》主持人被骗 嫌犯已被抓获 7808022
- 3 杭州“兔子警官”回应作秀质疑 7713769
- 4 为何今年全国粮食产量再创新高 7616144
- 5 爸爸冲奶粉 9个月宝宝急到开口说话 7523422
- 6 新突破!5.3秒飙到时速800公里 7428371
- 7 2026年央视春晚分会场官宣 7329455
- 8 王楚钦率队卫冕乒超男团冠军 7231809
- 9 成龙自曝和儿子一年打不了一次电话 7142052
- 10 台湾游客在东北就餐被邻桌抢着买单 7041216







程序员狗哥
