Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL BIGINT(20)与Varchar(31)的性能_Mysql_Performance_Benchmarking - Fatal编程技术网

MySQL BIGINT(20)与Varchar(31)的性能

MySQL BIGINT(20)与Varchar(31)的性能,mysql,performance,benchmarking,Mysql,Performance,Benchmarking,我已经读到,对于primare unique key,像23423337这样的bigint比像961637593864109_412954765521130这样的varchar好,但是当有一百万行时,比如说,我永远不会排序,而只选择/更新一行时,差异有多大。对我来说,使用varchar会舒服得多,当性能差异低于30%或任何时候,我会继续使用它。我找不到这方面的任何基准。这确实需要衡量,我们可以根据我们所知道的和我们所假设的进行一些“猜测”,但这些只是猜测 您没有提到这个表是InnoDB,还是具有

我已经读到,对于primare unique key,像23423337这样的bigint比像961637593864109_412954765521130这样的varchar好,但是当有一百万行时,比如说,我永远不会排序,而只选择/更新一行时,差异有多大。对我来说,使用varchar会舒服得多,当性能差异低于30%或任何时候,我会继续使用它。我找不到这方面的任何基准。

这确实需要衡量,我们可以根据我们所知道的和我们所假设的进行一些“猜测”,但这些只是猜测

您没有提到这个表是InnoDB,还是具有动态行的MyISAM,还是具有固定长度行的MyISAM。那会有所不同的

但是对于像您发布的值,
'961637593864109_412954765521130'
(31个字符),假设您使用的是单字节字符集(例如拉丁字符集),或者将这些特定字符编码为单字节的字符集(例如utf8)

对于InnoDB和MyISAM动态格式,该行的额外字节数为31+1-8=24。(BIGINT适合8个字节,31个字符的VARCHAR(31)值将使用32个字节。)

对于具有固定长度行的MyISAM表,每行相差23字节。(为所有31个字符保留了空间,不必存储长度。)

主键值也会在每个索引中重复,因此每个索引的空间也会增加

假设使用BIGINT的表行为120字节,使用VARCHAR的表行为144字节,则增加了20%。行越大,增加的百分比越小,反之亦然

对于1000000行(我非常想说“一个meelyun行”,就像邪恶博士把他的小指放在嘴角说“一百万美元”),每行额外的24字节总计约24MB

但这并不是那么容易。就InnoDB空间而言,问题在于如何将行“容纳”到一个块中。平均行大小越大,块中的可用空间量就越大

若您除了将行存储在磁盘上之外不处理行,那个么实际上只是增加了磁盘空间,增加了备份的时间和空间


如果一个块中的“144字节”行数与“120字节”行数相同,那么在空间上看不到任何差异。但是如果一个块中适合的行数越少,那么块就越多,InnoDB缓冲池中的空间就越大,i/o也就越多,等等


对于单个行的查询,无论是通过主键值还是通过某些其他唯一索引查找,差异都可以忽略不计

如果您处理的是较大的结果集,那么这就是准备结果集所需的额外内存,以及传输到客户端的额外字节,等等


如果VARCHAR键的设计方式使一起访问的行的“组”具有相同的键值前导部分,那么使用InnoDB,实际上可能会有一些性能改进。这是因为主键是群集键。。。满足查询所需的行更有可能位于同一块中,而不是分散在一堆块上


反之,如果执行了插入和删除,则某些块中会有更多的可用空间。(删除时,被删除行的空间保留在块中;要重新使用,您需要插入具有相同键值的行(或者至少插入一个足够接近的键值,使其落在同一块中。)并且使用随机插入,我们将得到块拆分。

这确实需要测量,我们可以进行一些“猜测”基于我们所知道的和我们所假设的,但这些只是猜测

您没有提到这个表是InnoDB,还是具有动态行的MyISAM,还是具有固定长度行的MyISAM,这会有所不同

但是对于像您发布的值,
'961637593864109_412954765521130'
(31个字符),假设您使用的是单字节字符集(例如拉丁字符集),或者将这些特定字符编码为单字节的字符集(例如utf8)

对于InnoDB和MyISAM动态格式,这是该行的31+1-8=24个额外字节。(BIGINT适合8个字节,31个字符的VARCHAR(31)值将使用32个字节。)

对于具有固定长度行的MyISAM表,这将是每行23字节的差异(为所有31个字符保留空间,并且不必存储长度)

主键值也会在每个索引中重复,因此每个索引的空间也会增加

假设使用BIGINT的表行是120字节,而使用VARCHAR的表行是144字节,则增加了20%。行越大,增加的百分比越小,反之亦然

对于1000000行(我非常想说“一个meelyun行”,就像邪恶博士把他的小指放在嘴角说“一百万美元”),每行额外的24字节总计约24MB

但这并不是那么容易。就InnoDB空间而言,问题在于如何将行“容纳”到一个块中。平均行大小越大,块中的可用空间就越大

若您除了将行存储在磁盘上之外不处理行,那个么实际上只是增加了磁盘空间,增加了备份的时间和空间


如果一个块中的“144字节”行数与“120字节”行数相同,那么您将看不到空间上的任何差异。但是如果一个块中的行数较少,则意味着块越多,InnoDB缓冲池中的空间就越多,i/o就越多,等等


对于单个行的查询,无论是通过主键值还是通过某些其他唯一索引查找,差异都可以忽略不计

如果您处理的是更大的结果集,那么这就是额外的内存