与INT相比,BIGINT-mysql的性能

与INT相比,BIGINT-mysql的性能,mysql,Mysql,我试图找出如果我将主键更改为BIGINT(20),表的性能是否会降低。目前,我正在使用INT(7),并且已经有大约300.000个条目具有大ID(7或8位)。 我已经搜索了很多,但只发现它使用了更多的磁盘空间(这是显而易见的) 现在我所有的身份证都有7位数字,但我的客户想改为8位。我将来不能轻易地更改软件,所以我考虑现在使用BIGINT(20)以防万一。即使我还不需要使用BIGINT,但使用BIGINT是否会降低性能 有这样做经验的人对速度和性能有什么建议吗?回答你的问题:是的,这样会降低性能。

我试图找出如果我将主键更改为BIGINT(20),表的性能是否会降低。目前,我正在使用INT(7),并且已经有大约300.000个条目具有大ID(7或8位)。 我已经搜索了很多,但只发现它使用了更多的磁盘空间(这是显而易见的)

现在我所有的身份证都有7位数字,但我的客户想改为8位。我将来不能轻易地更改软件,所以我考虑现在使用BIGINT(20)以防万一。即使我还不需要使用BIGINT,但使用BIGINT是否会降低性能


有这样做经验的人对速度和性能有什么建议吗?

回答你的问题:是的,这样会降低性能。显然,类型越大,表越大,查询速度越慢(I/O越多,索引越大,访问时间越长,结果不太可能适合各种缓存,等等)。因此,经验法则是:始终使用适合您需要的最小类型

尽管如此,性能并不重要。为什么?因为当你到达一个INT溢出的点时,BIGINT是唯一的解决方案,你必须接受它。此外,在这一点上(考虑到您使用的是自动增量PK,您将超过410亿行),您将面临更大的性能问题,与INT相比,BIGINT的开销将是您最不关心的问题

请考虑以下几点:

  • 如果不需要负值,则使用UNSIGNED,这将使限制加倍
  • 无符号整数最大值为4.294.967.295。如果您使用的是自动递增PK,您只有30000个条目,那么您真的不需要担心。你现在甚至可以使用MEDIUMINT,除非你计划实现真正的快速增长。(见附件)
  • 类型后括号中的数字不影响类型的最大值。INT(7)与INT(8)或INT(32)相同。如果指定ZEROFILL,则用于指示显示宽度(请参见)

不希望复活僵尸,但“现代”mysql使用列类型串行,这是一个bigint(20)无符号非空自动增量-当然,这表明mysql将(或将)优化使用bigint作为主键

另外,varbinary(16)primary允许(我们这样做)使用uuid_short()作为主键(而不是uuid–作为主键使用非常慢,因为它是一个字符串)-它具有确保每个记录都有一个在整个数据库(实际上是网络)中唯一的键的功能

但是请注意,某些强制会将bigint降级为int,结果很糟糕。例如,如果您将一个字符串表示与一个大整数进行比较,您可能会发现您得到了误报。所以我们必须用二进制来比较。。。乙二醇

where id = binary id_str

我个人认为这是一个未修复的bug…

这说明了我要做的一切。除非处理大量数据(300000个条目不是),否则几乎不可能达到INT字段的限制。正如这里提到的,(7)并没有真正限制字段存储的内容。我知道int(7)的大小,等等。但是我不在表中使用自动递增,因为数字是从另一个数据库导入的,并且它们比2个字符长得多。事实上,它的导入并不阻止您使用自动递增-AI值在一系列插入后自动设置PK的最大值(如果没有,您可以使用ALTER来更改它)。现在,如果您确实需要BIGINT,因为您可以拥有超过10位数的数字(例如序列号),那么是的,它的效率会稍低一些。如果你真的很担心并且流量很大,你可以使用一个单独的(小的)自动增量PK,并将你的BIGINT存储为一个唯一的索引(但坦率地说,我认为这不值得麻烦),所以你认为它的性能不会差很多?你在什么地方找到测试了吗?还是链接?是的,我认为在这种情况下,开销是边际的,你不会注意到。(我正在处理超过4000万行的表,在PK中使用BIGINT没有问题)