大家好,我是冰河~~
今天给大家带来一篇关于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 的这些测试,根本都测不出来时间差吧。
好了,今天就到这儿吧,我是冰河,我们下期见~~
写在最后
如果你想进大厂,想升职加薪,或者对自己现有的工作比较迷茫,希望我的一些经历能够帮助到大家~~