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

 更新时间:2021年08月09日 11:42:24   作者:来日可期0726  
在实际开发中可能会生成uuid作为主键那么疑问来了,到底MySQL 主键使用数字还是uuid查询快呢?下面小编给大家带来实例代码给大家详细介绍,感兴趣的朋友跟随小编一起看看吧

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

下面由测试来验证:

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

创建表:

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;

创建存储过程:

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;

生成数据:

CALL my_insert();

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

下图是采用explain分析得出

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

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类型的

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

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();

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

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

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

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

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

相关文章

  • MySQL5.7.03 更换高版本到MySQL 5.7.17安装过程及发现问题解决方案

    MySQL5.7.03 更换高版本到MySQL 5.7.17安装过程及发现问题解决方案

    这篇文章主要介绍了MySQL5.7.03 更换高版本到MySQL 5.7.17安装过程及发现问题解决方案,需要的朋友可以参考下
    2017-08-08
  • MySQL分区表的局限和限制详解

    MySQL分区表的局限和限制详解

    本文对Mysql分区表的局限性做了一些总结,因为个人能力以及测试环境的 原因,有可能有错误的地方,还请大家看到能及时指出,当然有兴趣的朋友可以去官方网站查阅。
    2017-03-03
  • SQL中current_date()函数的实现

    SQL中current_date()函数的实现

    日期时间类型的数据也是经常要用到的,SQL中也提供了一些函数对这些数据进行处理,本文主要介绍了SQL中current_date()函数的实现,具有一定的参考价值
    2024-02-02
  • ubuntu下mysql版本升级到5.7

    ubuntu下mysql版本升级到5.7

    这篇文章主要为大家详细介绍了ubuntu下mysql版本升级到5.7的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • mysql全连接和oracle全连接查询、区别及说明

    mysql全连接和oracle全连接查询、区别及说明

    这篇文章主要介绍了mysql全连接和oracle全连接查询、区别及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • MYSQL8 通过ibd文件恢复表数据的方法

    MYSQL8 通过ibd文件恢复表数据的方法

    这篇文章主要介绍了MYSQL8 通过ibd文件恢复表数据的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • Mysql数据库的优化详解

    Mysql数据库的优化详解

    这篇文章主要介绍了Mysql数据库的优化详解,查询优化的本质是让数据库优化器为SQL语句选择最佳的执行计划,一般来说,对于在线交易处理(OLTP)系统的数据库,减少数据库磁盘I/O是SQL语句性能优化的首要方法,需要的朋友可以参考下
    2023-07-07
  • MySQL中关于超键和主键及候选键的区别

    MySQL中关于超键和主键及候选键的区别

    这篇文章主要介绍了MySQL中关于超键和主键及候选键的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • 防止mysql重复插入记录的方法

    防止mysql重复插入记录的方法

    这篇文章主要为大家详细介绍了防止mysql重复插入记录的方法,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • Mysql事务隔离级别之读提交详解

    Mysql事务隔离级别之读提交详解

    这篇文章主要介绍了Mysql事务隔离级别之读提交详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01

最新评论