字段大小会影响查询时间吗?
Posted
技术标签:
【中文标题】字段大小会影响查询时间吗?【英文标题】:Does field size affect query time? 【发布时间】:2008-10-15 13:28:19 【问题描述】:我的问题是关于 mysql 的,但我也想知道这会如何影响其他数据库。我有几个字段是varchar(255)
,但我的同事坚持如果它们是varchar(30)
——或者任何更小的大小——那么查询会运行得更快。我不太确定,但如果是这样,我会承认的。
【问题讨论】:
【参考方案1】:这里的大多数其他答案都集中在 VARCHAR 以可变长度方式存储这一事实,因此它存储您在给定行上输入的字符串的字节数,而不是字段的最大长度。
但是在查询期间,在某些情况下 MySQL 会将 VARCHAR 转换为 CHAR ——因此大小会上升到最大长度。例如,当 MySQL 在某些 JOIN 或 ORDER BY 或 GROUP BY 操作期间创建临时表时,就会发生这种情况。
告诉所有情况下它会这样做很复杂,因为它取决于优化器如何处理查询,它取决于您定义的其他表结构和索引,它取决于查询的类型,甚至取决于MySQL 的版本,因为每个版本都改进了优化器。
简短的回答是肯定的,无论您使用 VARCHAR(255) 还是 VARCHAR(30),它可以有所不同。因此,根据您的需要定义列的最大长度,而不是为了传统而像 255 这样的“大”长度。
【讨论】:
我一直在官方文档中寻找这个,但我找不到任何相关的东西。你能指点我,或者提供一些官方参考吗?我特别想知道在VARCHAR(10000)
的情况下会发生什么,因为我理解CHAR(255)
是极限。谢谢
@MostyMostacho,我不知道文档中有任何参考。一位在 MySQL、Drizzle 和 Percona Server 源代码方面工作多年的高级开发人员告诉我。【参考方案2】:
这取决于查询和数据,但您可能优化得太早,甚至担心。
对于 SELECT 查询,语句本身在 MySQL 中的运行速度也一样快,只要数据不比在较小字段中的数据大,它就会以同样快的速度传输。如果较小的字段迫使您将信息存储在较小的空间中(您会使用额外的 225 个字符吗?),那么您将快速传输到其他程序。
对于 INSERT 查询,字段的大小不是问题,但使用可变长度字段会减慢完成过程。具有固定长度行的 INSERT 速度明显更快(至少在 MySQL 5.0 和更早版本中)。
通常,使用数据所需的大小。如果您不知道是需要 255 个字符还是 30 个字符,那么您可能优化得太早了。大数据字段是否会导致瓶颈?您的程序是否存在数据库性能问题?首先找到你的瓶颈,然后用它们解决问题。我猜您在这里查看的时间差异对于您要解决的任何问题都不重要。
【讨论】:
【参考方案3】:既然你问过其他数据库……
它绝对会影响查询时间。
在 Oracle 中,当数据从服务器移动到客户端时,它是通过缓冲区完成的。那里没有什么革命性的东西。它放入该缓冲区的行数基于最大行大小。假设您的查询返回 4 列 varchars。如果列的大小是 100 并且应该是 10,则 Oracle 在每次提取中容纳的行数将比使用正确大小的列定义时少 10 倍。这会导致不必要地重新读取块。它迫使更多的网络流量,更多的往返。
在 Oracle 中,您可以使用 SET ARRAYSIZE 更改缓冲区的大小。试一试,使用一种大小进行查询,然后使用 10% 的空间再次执行。你会看到读取次数增加,网络访问次数增加,性能下降。让列太大就像让缓冲区太小一样。
但准确大小列的真正原因是数据完整性。你把坏东西拒之门外。这与性能一样重要。
记住:
为之设计永远不会太早 性能 99% 你说的都回来了, 你不会 更简单、更好、更便宜 先把事情做好 时间。【讨论】:
【参考方案4】:如果您只使用前 30 个字符,那么 varchar(30) 和 varchar(255) 之间不会有区别(尽管 varchar(1000) 会有所不同,这将多取一个字节)。
当然,如果你最终使用超过 30 个字符,它会更慢,因为你有更多的数据要传递给客户端,而且你的索引会更大。
【讨论】:
在某些情况下会有所不同。我将查询速度从 4.25 秒提高到 3.1 秒,只是将VARCHAR(255)
减少到VARCHAR(35)
。最长的数据是 27 长,所以我什么都没丢失。该查询有 2 个连接,并在我更改的 VARCHAR
列上使用 GROUP BY
。【参考方案5】:
列宽很少会影响查询性能。当然,如果您使用较大的对象(BLOB、LONGBLOB、TEXT、LONGTEXT),则可能会提取大量数据。这可能会影响性能,但不一定。这实际上只影响存储。如果你关心数据类型的存储大小,可以参考http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html查看详情。
重申一下:数据的存储大小不一定会影响查询速度。还有许多其他设计考虑因素会影响查询速度。表和关系、键结构、索引、查询和连接架构等的设计。
【讨论】:
【参考方案6】:几年前,很多人建议在 MySQL 中使用 tinytext
而不是 varchar
来提高性能,因为在行数据大小不变的情况下,逐行搜索应该更快。 MySQL 的查询、存储和索引处理算法肯定是从那时起演变而来的,现在可能没有那么大的影响。
但您可能优化得太早了,不应该担心这个级别的性能。
【讨论】:
【参考方案7】:任何小于 VARCHAR(255) 的内容都将使用一个字节来存储它的 大小,因此 VARCHAR(30) 和 VARCHAR(255) 不会有任何区别。
但是看看你的数据是否一致,我的意思是,总是相同的大小,在这种情况下使用 CHAR 会更有用,因为你不会浪费时间在大小信息上,而且你的搜索会更容易找到数据,此处不在帐户索引中。
即使您的数据不一致,但会发生变化,比如说一个字节,一个 CHAR 会更好,因为无论如何您都会浪费一个字节的大小信息。
【讨论】:
嗯?您可以将 255 个字符放入 1 个字节中吗?这一定是人们使用 MySQL 的原因。它具有令人难以置信的压缩效果。 我想你不明白。任何小于 VARCHAR(255) 的东西都将使用一个字节来存储它的 SIZE,而不是 VALUE。大于该值的任何内容都使用 2 个字节来存储大小。下次阅读更好。 也许有点粗体或斜体或下划线会帮助像我这样的白痴。试一试。 它的大小。它的大小。它的大小。它的大小存储在第一个字节或 2 中。它的大小。它的大小。它的大小。你感兴趣的尺寸是多少?顺便说一句,我听说 varchar 列的所有(its
,而不是it's
)单元格的大小与其(不是)最大组件的大小相同。因此,如果您有 VARCHAR(255)
列,并且 99/100 项的长度为 25,但 1 的长度为 50,那么整个列将以 50 长度存储。但即使是空旷的空间也会有所作为。通过将我的VARCHAR(255)
减少到 35(最长的数据是 27),我看到了 GROUP BY
的巨大减少。 (MySQL 5.6)以上是关于字段大小会影响查询时间吗?的主要内容,如果未能解决你的问题,请参考以下文章