在 MySQL 中设计表的时候,MySQL 官方推荐不要使用 uuid 或者不连续不重复的雪花 id(long 形且唯一,单机递增),而是推荐连续自增的主键 id,官方的推荐是 auto_increment。
那么为什么不建议采用 uuid,使用 uuid 究竟有什么坏处?本文我们从以下几个部分来分析这个问题,探讨一下内部的原因:
- MySQL 程序实例
- 使用 uuid 和自增 id 的索引结构对比
- 总结
MySQL 程序实例
要说明这个问题,我们首先来建立三张表,分别是:
- user_auto_key
- user_uuid
- user_random_key
他们分别表示自动增长的主键,uuid 作为主键,随机 key 作为主键,其他我们完全保持不变。
根据控制变量法,我们只把每个表的主键使用不同的策略生成,而其他的字段完全一样,然后测试一下表的插入速度和查询速度。
注:这里的随机 key 其实是指用雪花算法算出来的前后不连续不重复无规律的id:一串 18 位长度的 long 值。
id 自动生成表:
用户 uuid 表:
随机主键表:
光有理论不行,直接上程序,使用 Spring 的 jdbcTemplate 来实现增查测试。
技术框架:Spring Boot+jdbcTemplate+junit+hutool,程序的原理就是连接自己的测试数据库,然后在相同的环境下写入同等数量的数据,来分析一下 insert 插入的时间来进行综合其效率。
为了做到最真实的效果,所有的数据采用随机生成,比如名字、邮箱、地址都是随机生成:
package com.wyq.mysqldemo;
imp