服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - 浅析MySQL 主键使用数字还是uuid查询快

浅析MySQL 主键使用数字还是uuid查询快

2021-09-17 16:33来日可期0726 Mysql

在实际开发中可能会生成uuid作为主键那么疑问来了,到底MySQL 主键使用数字还是uuid查询快呢?下面小编给大家带来实例代码给大家详细介绍,感兴趣的朋友跟随小编一起看看吧

在实际开发中mysql的主键不能重复,可能会采用主键自增,为了防止主键重复也可能会采取雪花算法之类的算法保证,这两种主键保存的都是number类型 但是实际开发中可能会生成uuid作为主键那么疑问来了,到底哪种主键的效率高呢?

下面由测试来验证:

1.首先我们先创建一个表,用存储过程生成100w条数据然后分析:

创建表:

?
1
2
3
4
5
6
7
8
create table `my_tables` (
`id` varchar(32) not null ,
`name` varchar(32) default null,
`age` int(32) default null,
`time` varchar(32) default null,
`pwd` varchar(32) default null,
primary key (`id`)
) engine=myisam auto_increment=5 default charset=utf8;

创建存储过程:

?
1
2
3
4
5
6
7
8
9
10
11
12
drop procedure if exists my_insert;
create procedure my_insert()
begin
declare n int default 1;
loopname:loop
insert into `my_tables`(`name`,`age`,`time`,`pwd`) values ('张三', 18, '0:0:0:0:0:0:0:1', '369');
set n=n+1;
if n=1000000 then
leave loopname;
end if;
end loop loopname;
end;

生成数据:

?
1
call my_insert();

第一种方式采用的主键是number类型的

下图是采用explain分析得出

浅析MySQL 主键使用数字还是uuid查询快

2.接下来继续创建另一张表并生成数据

?
1
2
3
4
5
6
7
8
create table `my_tables2` (
`id` varchar(32) not null ,
`name` varchar(32) default null,
`age` int(32) default null,
`time` varchar(32) default null,
`pwd` varchar(32) default null,
primary key (`id`)
) engine=myisam auto_increment=5 default charset=utf8;

注意:这张表的主键采用的是varchar类型的

创建存储过程并生成数据:

?
1
2
3
4
5
6
7
8
9
10
11
12
drop procedure if exists proc_insert;
delimiter $
create procedure pro_insert2()
begin
declare i int default 1;
while i<=1000000 do
insert into `my_tables2`(id,`name`,`age`,`time`,`pwd`) values (i,'张三', 18, '0:0:0:0:0:0:0:1', '369');
set i = i+1;
end while;
end $;
 
call pro_insert2();

下图是第二种用主键查询的结果

浅析MySQL 主键使用数字还是uuid查询快

如果有小伙伴对explain不太明白的可以去看看博客 https://blog.csdn.net/why15732625998/article/details/80388236

前后分析得出 使用uuid或者数字作为主键它的查询效率相差的并没有想象中的大,几乎可以忽略不记 只有key_len有些差别。

key_len:表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度,在不损失精确性的情况下,长度越短越好。key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。

到此这篇关于浅析mysql 主键使用数字还是uuid查询快的文章就介绍到这了,更多相关mysql主键用数字还是uuid内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/zhangmeng0726/p/15117820.html

延伸 · 阅读

精彩推荐
  • Mysqlubuntu server配置mysql并实现远程连接的操作方法

    ubuntu server配置mysql并实现远程连接的操作方法

    下面小编就为大家分享一篇ubuntu server配置mysql并实现远程连接的操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 ...

    EricRae5462020-08-23
  • MysqlMYSQL中 char 和 varchar的区别

    MYSQL中 char 和 varchar的区别

    这篇文章主要介绍了MYSQL中 char 和 varchar的区别,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下...

    从零开始的DBA生活1502020-09-19
  • MysqlMySQL前缀索引导致的慢查询分析总结

    MySQL前缀索引导致的慢查询分析总结

    前缀索引,并不是一个万能药,他的确可以帮助我们对一个写过长的字段上建立索引。但也会导致排序(order by ,group by)查询上都是无法使用前缀索引的...

    MYSQL教程网5052019-12-25
  • MysqlUbuntu手动安装mysql5.7.10

    Ubuntu手动安装mysql5.7.10

    这篇文章主要为大家详细介绍了Ubuntu手动安装mysql5.7.10的详细过程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 ...

    陈哞哞6482020-07-17
  • Mysql使用Perl DBI操作MySQL的一些建议

    使用Perl DBI操作MySQL的一些建议

    这篇文章主要介绍了使用Perl DBI操作MySQL的一些建议,针对Perl下连接MySQL的DBD::MySQL这个模块,需要的朋友可以参考下 ...

    吴炳锡2262020-05-07
  • Mysqlmysql多表join时候update更新数据的方法

    mysql多表join时候update更新数据的方法

    如果item表的name字段为''就用resource_library 表的resource_name字段前面加上字符串Review更新它,他们的关联关系在表resource_review_link中。 ...

    MYSQL教程网5242019-11-16
  • MysqlMySQL实现树状所有子节点查询的方法

    MySQL实现树状所有子节点查询的方法

    这篇文章主要介绍了MySQL实现树状所有子节点查询的方法,涉及mysql节点查询、存储过程调用等操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下 ...

    yiluoAK_473072020-06-15
  • Mysql解决mysql服务器在无操作超时主动断开连接的情况

    解决mysql服务器在无操作超时主动断开连接的情况

    这篇文章主要介绍了解决mysql服务器在无操作超时主动断开连接的情况,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 ...

    杨彦星2332020-08-01