时间:2022-02-04 08:54:36 | 栏目:Mysql | 点击:次
在实际开发中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是根据表定义计算而得,不是通过表内检索出的。