MySQL流言之int性能比char高很多

网络上有许多似是而非的“谣言”,当然都不是恶意,大部分都是开发者不愿意自己主动研究,反而轻信其他人的信口揣测之言。

关于MySQL数据库的谣言也有不少,其中之一就是int性能比char高很多

本着严谨考证的原则,我最近针对int、long、char、varchar进行了一次简单的性能测试,可以证明它们其实并没有太大的性能差距。

测试备注

c8=char(8), s8=varchar(8), i8=(bigint), c4=char(4), s4=varchar(4), i4=char(4)

100w行无索引情况下查询

执行[c8查询]20次, 平均耗时312.0ms
执行[s8查询]20次, 平均耗时334.3ms
执行[i8查询]20次, 平均耗时276.95ms
执行[c4查询]20次, 平均耗时354.95ms
执行[s4查询]20次, 平均耗时340.45ms
执行[i4查询]20次, 平均耗时291.1ms

创建索引

c8索引耗时2439ms
s8索引耗时2442ms
i8索引耗时1645ms
c4索引耗时2296ms
s4索引耗时2303ms
i4索引耗时1403ms

有索引情况下查询

执行[c8查询]10000次, 平均耗时0.271ms
执行[s8查询]10000次, 平均耗时0.2354ms
执行[i8查询]10000次, 平均耗时0.2189ms
执行[c4查询]10000次, 平均耗时0.303ms
执行[s4查询]10000次, 平均耗时0.3094ms
执行[i4查询]10000次, 平均耗时0.25ms

结论

无索引:全表扫描不会因为数据较小就变快,而是整体速度相同,int/bigint在数学运算上快10%。
有索引:char与varchar性能差不多,int速度稍快18%

在数据存储、读写方面,整数与等长字符串相同,varchar额外多了一个字节所以性能可能会些许影响(1/n)。
在数据运算、对比方面,整数得益于原生支持,因此会比字符串稍快一些
若采用索引,所谓整数、字符串的性能差距更是微乎其微。

这个结论其实是比较幼稚的,因为磁盘空间基本相同的字段,即使其数据类型不同,但在底层磁盘IO上的性能损耗肯定是一样的。之所以多此一举地单独写这篇文章,是因为总是有人莫名其妙的坚持奇怪的论点,既不思考原理也不动手实验,既然这样我就动手替大家简单测试一下以正视听。