字段大小会影响查询时间吗?

时间:2008-10-15 13:28:20

标签: mysql sql database

我的问题是关于MySQL,但我也想知道这会如何影响其他数据库。我有几个varchar(255)字段,但我的同事坚持认为它们是varchar(30) - 或者任何较小的字段 - 然后查询会运行得更快。我不太确定,但如果是这样我会承认的。

7 个答案:

答案 0 :(得分:5)

这取决于查询和数据,但您可能很快就会优化甚至担心。

对于SELECT查询,语句本身在MySQL中运行速度一样快,只要数据不会比在较小的字段中大,那么它将以尽可能快的速度传输。如果较小的字段强制您将信息存储在较小的空间中(您是否会使用额外的225个字符?),那么您将快速传输到其他程序。

对于INSERT查询,字段的大小不是问题,但使用可变长度字段将减慢完成的过程。具有固定长度行的INSERT明显更快(至少在MySQL 5.0及更早版本中)。

通常,使用数据所需的大小。如果您不知道是否需要255个字符或30个字符,那么您可能很快就会优化。大数据领域是否会造成瓶颈?您是否编程遭受数据库性能问题?首先找到你的瓶颈,然后用他们解决问题。我猜你在这里看到的时间差异对于你要解决的问题并不重要。

答案 1 :(得分:5)

这里的大多数其他答案都集中在VARCHAR以可变长度方式存储的事实,因此它存储您在给定行上输入的字符串的字节数,而不是字段的最大长度。

但是在查询期间,在某些情况下MySQL会将VARCHAR转换为CHAR - 因此大小会达到最大长度。例如,当MySQL在某些JOIN或ORDER BY或GROUP BY操作期间创建临时表时,就会发生这种情况。

告诉所有这样做的情况很复杂,因为它取决于优化器如何处理查询,它取决于您定义的其他表结构和索引,它取决于查询的类型,甚至取决于MySQL的版本,因为每个版本都对优化器进行了改进。

简短的回答是肯定的,无论你使用VARCHAR(255)还是VARCHAR(30),它都可以 。因此,根据您的需要定义列最大长度,而不是为了传统而定义像255这样的“大”长度。

答案 2 :(得分:1)

因为您询问了其他数据库......

它绝对会影响查询时间。

在Oracle将数据从服务器移动到客户端时,它通过缓冲区完成。没有什么革命性的。它放在该缓冲区中的行数基于最大行大小。假设您的查询返回4列varchars。如果列的大小为100且应该为10,那么Oracle在每次提取中的行数将比使用右侧列定义的行少10倍。这导致不必要地重新读取块。它会增加网络流量,增加往返次数。

在Oracle中,您可以使用SET ARRAYSIZE更改缓冲区的大小。尝试一下,用一种尺寸进行查询,然后再用10%的空间再做一次。你会看到读数上升,网络旅行增加,性能下降。使列太大就像使缓冲区太小一样。

但准确大小的列的真正原因是数据完整性。你把坏东西拿走了。这和表现一样重要。

记住:

  • 设计永远不会太早 性能
  • 你说的99%回来, 你不会
  • 它更容易,更好,更便宜 先把事情做对 时间。

答案 3 :(得分:0)

如果你只使用前30个字符,那么varchar(30)和varchar(255)之间没有区别(虽然与varchar(1000)会有区别,多花点一点。)

当然,如果你最终使用超过30个字符,那么当你有更多的数据传递给客户端时它会更慢,而你的索引会更大。

答案 4 :(得分:0)

小于VARCHAR(255)的任何内容都将使用一个字节来存储它的大小,因此VARCHAR(30)和VARCHAR(255)不会产生任何影响。

但是看看你的数据是否一致,我的意思是,总是相同的大小,在这种情况下使用CHAR会更有用,因为你不会浪费时间大小信息,你的搜索会更容易找到数据,而非此处的帐户索引。

即使你的数据不一致但改变了一个字节,一个字节,CHAR也会更好,因为无论如何你都会浪费一个带有大小信息的字节。

答案 5 :(得分:0)

列宽很少会影响查询性能。当然,如果您使用较大的对象(BLOB,LONGBLOB,TEXT,LONGTEXT),可能会有大量数据被拉扯。这可能会影响性能,但不一定如此。这实际上只影响存储。如果您关注数据类型的存储大小,可以参考http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html查看详细信息。

并重申:数据的存储大小不一定会影响查询的速度。还有许多其他设计注意事项会影响查询速度。表和关系的设计,关键结构,索引,查询和连接体系结构等。

答案 6 :(得分:0)

几年前,许多人建议在MySQL中使用tinytext而不是varchar来提高性能,因为对于常量行数据大小,逐行搜索应该更快。当然,MySQL的查询,存储和索引处理算法从那时起逐渐发展,现在可能没有那么大的影响。

但是你可能很快就会优化,不应该担心这个级别的表现。