`

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

    Hibernate用UUID作为主键的Demo,采用Java默认的方法,来生成对应的ID后,存储到数据库中

    Mysql修改server uuid的方法分享

    如果从服务器是克隆的主服务器,那么server-uuid的值肯定是一样的,不然后面主从复制报错误1593,修改以后重启mysql 下面就来给大家介绍相关的解决方法,话不多说了,来一起看看详细的介绍吧。 解决方法 1. 首先要...

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

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

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

    主要给大家介绍了关于spring boot整合mybatis利用Mysql实现主键UUID的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

    深入分析mysql为什么不推荐使用uuid或者雪花id作为主键

    前言:在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究竟有什么坏处?...

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

    主要介绍了Mysql中存储UUID去除横线的方法,本文给出了3个Mysql函数实现去除去UUID中的横线,需要的朋友可以参考下

    自动生成主键uuid.zip

    使用Java的Util.UUID生成32位的有序与无序id

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

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

    laravel-optikey:在Laravel中使用UUID或Ulid作为可选键或主键

    在Laravel中使用UUID或Ulid作为可选键或主键。 composer require riipandi/laravel-optikey 该软件包添加了一个非常简单的特征,可以为您的模型自动生成UUID或Ulid。 快速开始 更新您的架构 首先,您需要在迁移中...

    activerecord-mysql-uuid-column:ActiveRecord MySQL 适配器的真实 UUID 列

    ActiveRecord::Mysql::UuidColumn 向ActiveRecord MySQL2适配器添加一个:uuid列,该列存储在一个16字节的二进制列中。 这正是它需要的空间。安装将此行添加到您的应用程序的Gemfile中: gem 'activerecord-mysql-...

    JAVA UUID 生成全球唯一ID

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

    mycat 主键自增代码

    mycat 主键自增代码

    upknit:用于Rails + Postgresql的自动UUID主键启动器

    上装 使用PostgreSQL将这个gem添加...这个gem做两件事来启用UUID主键。 启用PostgreSQL扩展以计算UUID(v4)。 配置生成器以使用UUID 作为新生成表的主键。 作为参考类型。 执照 根据的规定,该gem可作为开源软件。

    返回Long型UUid

    最近自己开发时需要一个16位纯数字的UUIDUtil,所以封装了一个纯数字16位的UUIDUtil,返回Long型UUid,希望可以帮到大家!

    多种数据库下获得32位UUID的方法

    多种数据库下获得32位UUID的方法,包括MYSQL,SQLSERVER,Oracle ,以及mySQL 下使用当前时间的函数使用

    浅谈java获取UUID与UUID的校验

    主要介绍了java获取UUID与UUID的校验,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    sqlserver数据库主键的生成方式小结(sqlserver,mysql)

    主键的生成方式主要有三种: 一. 数据库自动生成 二. GUID 三. 开发创建 严格讲这三种产生方式有一定的交叉点,其定位方式将在下面进行讲解。 第一种方式,主要将其定位在自增长的标识种子:可以设置起始数值,及...

Global site tag (gtag.js) - Google Analytics