`

mysql5.5 uuid做主键与int做主键的性能实测

 
阅读更多

偶然的机会,得知mysql主键的类型采用 varchar 存UUID 的查询性能没有int型做主键好。网上查询大量资料,都是停留在理论上的,因此,自己写了代码进行实测,以下结果仅供参考,不具备权威性。

 

三个表的字段,除了主键ID 分别采用varchar,bigint 和自动增长bigint不同外,其他三个字段都为 varchar 36位

 

数据库:mysql5.5

表类型:InnoDB

数据量:100W条

 

第一种情况:

 

主键采用uuid 32位。

 

运行查询语句1:SELECT COUNT(id) FROM test_varchar;

运行查询语句2:SELECT * FROM test_varchar WHERE vname='00004629-b052-11e1-96aa-002655b28d7b';

运行查询语句3:SELECT * FROM test_varchar WHERE id='00004599b05211e196aa002655b28d7b';

  

 

语句1消耗时间平均为:2.7秒;

语句2消耗时间平均为:3秒;

语句3消耗时间平均为:0秒;(多方测试,条件里只要有主键ID,查询速度毫秒级都显示000。测试的ID值,有前一百条的,也有后90多万条的。查询时间完全一样,毫秒级都为000)

 

第二种情况:

 

主键采用bigint,使用uuid_short()产生数据,数据为有序列的纯数字(22461015967875697)。(其相当于自动增长,只是固定的基数值较大而已。)

 

 

运行查询语句1:SELECT COUNT(id) FROM test_long;

运行查询语句2:SELECT * FROM test_long WHERE vname='d7f28a24-b053-11e1-96aa-002655b28d7b';

运行查询语句3:SELECT * FROM  test_long WHERE id='22461015967875702';

 

 

语句1消耗时间平均为:1.2秒;

语句2消耗时间平均为:1.40秒;

语句3消耗时间平均为:0秒;(多方测试,条件里只要有主键ID,查询速度毫秒级都显示000。测试的ID值,有前一百条的,也有后90多万条的。查询时间完全一样,毫秒级都为000)

 

第三种情况:

 

运行查询语句1:SELECT COUNT(id) FROM test_int;

运行查询语句2:SELECT * FROM test_int WHERE vname='c80f8427-b059-11e1-96aa-002655b28d7b';

运行查询语句3:SELECT * FROM test_int WHERE id=900000;

 

主键采用mysql自带的自动增长,数据为纯数字(1,2,3,4,5……)。

 

查询语句1消耗时间平均为:1.07秒;

查询语句2消耗时间平均为:1.31秒;

查询语句3消耗时间平均为:0秒;(多方测试,条件里只要有主键ID,查询速度毫秒级都显示000。测试的ID值,有前一百条的,也有后90多万条的。查询时间完全一样,毫秒级都为000)

 

总结:由此可见,mysql InnoDB 主键采用自动增长性能较高。

笔者自语:平时的项目开发,sql语句的条件里有ID的,占多数,没有的占少数。虽然以上的测试表明只要条件语句里有主键ID,主键类型不一样,查询时间完全一样。但是,你不能保证你的项目中所有sql语句的条件里都有ID,因此…………主键的类型该采用哪种,相信各位看官已经明白。

 

 

---------------------------------------------------------华丽的分割线----------------------------------------------------------

 

 

 

 

数据库:mysql5.5

表类型:MyISAM

数据量:100W条

 

 

为了少写一些字,节省时间,此测试所使用的表和sql语句同上,此处只记录消耗时间。

 

 

第一种情况:

主键采用uuid 32位。

 

 

语句1消耗时间平均为:0秒;

语句2消耗时间平均为:0.53秒;

语句3消耗时间平均为:0秒;(多方测试,条件里只要有主键ID,查询速度毫秒级都显示000。测试的ID值,有前一百条的,也有后90多万条的。查询时间完全一样,毫秒级都为000)

 

 

第二种情况:

主键采用bigint,使用uuid_short()产生数据,数据为有序列的纯数字(22461015967875697)。(其相当于自动增长,只是固定的基数值较大而已。)

 

 

语句1消耗时间平均为:0秒;

语句2消耗时间平均为:0.51秒;

语句3消耗时间平均为:0秒;(多方测试,条件里只要有主键ID,查询速度毫秒级都显示000。测试的ID值,有前一百条的,也有后90多万条的。查询时间完全一样,毫秒级都为000)

 

第三种情况:

主键采用mysql自带的自动增长,数据为纯数字(1,2,3,4,5……)。

 

语句1消耗时间平均为:0秒;

语句2消耗时间平均为:0.48秒;

语句3消耗时间平均为:0秒;(多方测试,条件里只要有主键ID,查询速度毫秒级都显示000。测试的ID值,有前一百条的,也有后90多万条的。查询时间完全一样,毫秒级都为000)

 

 

总结:由此可见,mysql MyISAM 主键采用自动增长性能比其他有微弱的优势。测试数据为100w,如果是1000W 1亿,我想这个优势会拉大,如果你还有外键关联查询,这个优势就更明显了。当然,如果你设计的系统,数据量还没有超过100W,你用啥主键类型都无所谓。我测试电脑是笔记本,如果是专业的服务器,估计100W条,mysql MyISAM 的这些测试,根本都测不出来时间差。

 

 

 

大总结:本来是要测mysql主键类型不同,查询效率的差别的,怎么写到最后,感觉像是在测mysql InnoDB和MyISAM的优劣了,无限纠结中……,有时间测下oracle!!

分享到:
评论
2 楼 jdnull 2015-11-24  
你这只考虑查询啊。并发插入呢?
1 楼 bastengao 2013-01-06  
可加上 limit 用例试试效果

相关推荐

    Hibernate用UUID作为主键的Demo

    在使用UUID作为主键时,数据库表对应的主键字段应设置为足够的长度,如MySQL的`CHAR(36)`或PostgreSQL的`VARCHAR(36)`,以容纳32位十六进制字符串加上4个破折号。 ### 6. 测试与运行 在实际项目中,你可以创建一个...

    Mysql修改server uuid的方法分享

    如果你遇到其他与MySQL Server UUID相关的问题,可以查阅更多相关文章以获取解决方案。 在实际的系统维护中,除了手动修改,还可以通过MySQL的一些管理工具,如`mysqladmin`或配置脚本来自动化这个过程。同时,对于...

    spring boot整合mybatis利用Mysql实现主键UUID的方法

    在Spring Boot项目中,整合MyBatis并利用MySQL实现主键UUID是一种常见的需求,尤其是在分布式系统中,为了保证数据的一致性和唯一性。UUID(Universally Unique Identifier)是一种全局唯一的标识符,它由128位数字...

    mysql-5.5.56-winx64.zip

    MySQL 5.5系列是MySQL的一个重要里程碑,它在2010年发布,引入了许多新特性和性能提升。以下是一些关键知识点: 1. **InnoDB存储引擎增强**:MySQL 5.5默认使用InnoDB存储引擎,提供了事务处理、行级锁定和外键支持...

    mysql修改自增长主键int类型为char类型示例

    在MySQL数据库中,主键是表的一个重要组成部分,它用于唯一标识每条记录,并且通常设置为自动增长的整数类型,如INT。然而,在某些业务场景中,可能需要将已有的自增长主键INT类型改为CHAR类型。这通常发生在需要更...

    公司实际项目中采用UUID算法生成主键的工具类

    公司实际项目中采用UUID算法生成主键的工具类,有需要的朋友们可以拿去

    自动生成主键uuid.zip

    总结来说,"自动生成主键uuid.zip"中的内容可能涉及到如何在Java中使用UUID生成32位的无序和有序ID,这对于数据库主键或其他需要全局唯一标识的场景非常有用。通过理解UUID的生成机制和结合其他数据,开发者可以定制...

    mysql_guid主键生成方式范例

    MySQL中的GUID(Globally Unique Identifier)主键生成方式是一种确保数据库中每一条记录具有唯一标识的方法,尤其在分布式系统中十分常见。本示例主要介绍如何通过Hibernate框架配置,来实现MySQL数据库中GUID主键...

    mysql雪花算法生成唯一整型ID主键的实现方法

    例如,这里使用了一个19位的UUID_SHORT()生成的数值,加上特定前缀"1987",使其与雪花算法的长度和格式保持一致: ```sql INSERT INTO sequence SET name='myseq'; SELECT setval('myseq', 1987378867709424090); `...

    mycat 主键自增代码

    其中,AUTO_INCREMENT 策略是与 MySQL 自增主键类似的方式,适用于单表插入操作。在 Mycat 配置文件 schema.xml 中,可以通过设置 <primary-key> 元素来指定主键生成策略。 2. AUTO_INCREMENT 配置 要启用 AUTO_...

    Mysql中存储UUID去除横线的方法

    在MySQL中,UUID(Universally Unique Identifier)是一种广泛使用的全局唯一标识符,通常表现为36个字符...这样,当你需要在MySQL中存储和检索UUID时,就可以方便地利用这些自定义函数,提高数据库操作的效率和性能。

    Mysql中存储UUID去除横线的方法.doc

    Mysql中存储UUID去除横线的方法.doc

    浅谈MySQL中的自增主键用完了怎么办

    面试官:”用过mysql吧,你们是用自增主键还是UUID?” 你:”用的是自增主键” 面试官:”为什么是自增主键?” 你:”因为采用自增主键,数据在物理结构上是顺序存储,性能最好,blabla…” 面试官:”那自增主键...

    JPA主键策略(针对数据库自增字段重置后无效检查项)

    uuid是一种基于128位的uuid算法生成主键的策略。这种策略生成的主键是一个32位的16进制数字的字符串。这种策略占用空间较大,因为主键是一个字符串类型的字段。uuid策略适用于需要高唯一性的场景,但它占用空间较大...

    JAVA UUID 生成全球唯一ID

    GUID是一个128位长的数字,一般用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随即数来生成GUID。从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不重复

    主键的选择1

    在MySQL数据库中,主键是表结构设计的关键要素,它用于唯一标识一条记录。自增主键是最常见的主键类型,通常使用INT或BIGINT数据类型。INT占用4字节,最大可表示2147483648,适合存储较小的数据量。若预期数据量可能...

Global site tag (gtag.js) - Google Analytics