我通常对varchar字段使用最大字符,所以在大多数情况下我设置255但只在列中使用16个字符...
这是否会降低我的数据库的性能?
答案 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)
有两种方法会降低性能。
确定这一点的最佳方法是对数据库进行基准测试。