大家好,我是冰河~~

今天给大家带来一篇关于MySQL的技术文,这也是我对MySQL使用UUID做主键与int数字做主键做的性能压测。

之前,总有小伙伴问我:为何使用UUID做MySQL的主键,MySQL性能会比较低。之前我也跟大家基于MySQL的底层数据结构讨论了为何使用UUID做主键性能比较低下。

今天,我们就一起基于MySQL 5.7做一个实际的主键性能压测。让大家切实感受下使用UUID做MySQL的主键和int数字做MySQL的主键,性能到底有多少差异。

环境准备

在MySQL 5.7中分别创建三张数据表:

  • test_varchar:以UUID作为主键。
  • test_long:以bigint作为主键。
  • test_int:以int作为主键。

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

另外,建表时使用InnoDB存储引擎,并且向数据库中插入100W条数据,用以测试。

InnoDB压测情况

压测信息

  • 数据库:MySQL 5.7
  • 表类型: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

主键采用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)

主键采用自增int

运行查询语句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 主键采用自动增长性能较高,但是在技术工作中,能否直接使用自增int类型的数字作为MySQL的主键,大家需要根据具体需求确定。

MyISAM压测情况

压测信息

  • 数据库:MySQL 5.7
  • 表类型:MyISAM
  • 数据量:100W条

注意:此处测试所使用的表和SQL语句同上,此处只记录消耗时间。

主键采用uuid 32位

主键采用uuid 32位。

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

主键采用bigint

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

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

主键采用自增int

主键采用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 的这些测试,根本都测不出来时间差吧。

好了,今天就到这儿吧,我是冰河,我们下期见~~

写在最后

如果你想进大厂,想升职加薪,或者对自己现有的工作比较迷茫,希望我的一些经历能够帮助到大家~~