总是使用255个字符来varchar字段降低性能?

时间:2014-02-10 19:32:46

标签: mysql database-performance

我通常对varchar字段使用最大字符,所以在大多数情况下我设置255但只在列中使用16个字符...

这是否会降低我的数据库的性能?

3 个答案:

答案 0 :(得分:5)

当涉及到存储时,VARCHAR(255)列将占用1个字节来存储实际值的长度加上存储实际值所需的字节。

对于latin1 VARCHAR(255)列,最多256个字节。对于UTF8列,每个字符最多可占用3个字节(尽管很少),最大大小为766个字节。我们知道InnoDB中单个字节的最大索引长度(以字节为单位)是767字节,因此可能是某些人将255声明为支持的最大列长度的原因。

因此,再次,在存储值时,它只占用实际需要的空间。

但是,如果列已建立索引,则索引会自动分配最大可能大小,以便索引中的每个节点都有足够的空间来存储任何可能的值。在搜索索引时,MySQL一次以特定字节大小的块加载节点。大节点意味着每次读取的节点更少,这意味着搜索索引需要更长的时间。

在将值存储在临时表中进行排序时,MySQL也会使用最大大小。

因此,即使您没有使用索引,但执行的查询无法使用索引进行排序,您也会受到性能影响。

因此,如果您的目标是性能,则将任何VARCHAR列设置为255个字符不应成为经验法则。相反,您应该使用最低要求。

可能存在边缘情况,你宁愿每天都在遭遇性能,这样你就不必完全锁定表来增加列的大小,但我认为这不是常态。

一个可能的例外是,如果您要加入两个表之间的VARCHAR列。 MySQL says

  

如果声明了列,MySQL可以更有效地使用列上的索引   相同的类型和大小。

在这种情况下,您可以使用两者之间的最大尺寸。

答案 1 :(得分:2)

每当你谈论“表现”时,你只能找到一种方法:基准测试。

从理论上讲,VARCHAR(20)VARCHAR(255)之间没有区别,如果它们都填充了相同的数据。请记住,如果你的长度错误,你会遇到大量的截断问题,MySQL在开始砍掉数据之前不会发出警告。

我尽量避免在VARCHAR列上设置限制,除非数据在更长时间内完全无效。例如,两个字符ISO country codes可以存储在VARCHAR(2)中,因为较长的字符串无意义。对于其他事情,特别是姓名或电话号码,限制长度可能也可能有害。

但是,您仍需要测试您创建的任何架构,以确保它符合您的性能要求。我希望你很难在VARCHAR(25)VARCHAR(16)之间发现任何差异。

答案 2 :(得分:0)

有两种方法会降低性能。

  • 如果您多次加载这些列,在列上执行连接,或其他类似的事情,则意味着需要多次访问它们。次数取决于您的机器,但请考虑数百万的订单。
  • 如果你总是填充字段(在varchar(20)中使用20个字符,那么每当你执行插入时,长度检查会增加一点开销。

确定这一点的最佳方法是对数据库进行基准测试。