2011-02-15 30 views
2

我在整个应用程序中使用VARCHAR,并发现一些特别令人困惑的事情......为什么我需要用长度定义我的SQL VARCHAR列,如VARCHAR(50)或VARCHAR(1000)?这个长度限制允许我定义我的首选最大字符串长度的唯一目的是什么? VARCHAR(50)和VARCHAR(1000)之间是否存在性能差异?附加到VARCHAR的大小度量标准是什么?

回答

2

这完全取决于您的DBMS的内部。例如,如果您索引一个varchar列,几乎肯定会将关键部分设置为最大大小。

这是因为索引必须非常高效,并且您不希望在这种情况下使用可变长度字段,因为它可能会减慢速度。

即使在数据库的数据区域中,您也可能会发现它只允许最大的大小。我已经看到只将行中的指针存储到磁盘堆中的提议,但这意味着每行有两个磁盘读取,我无法看到这对于大规模性能是非常好的选择。

列的大小会影响性能,例如一次可以读入多少条记录,多少条记录可以放入n元树索引节点等等。

+1

有趣的想法。但是,为什么索引长度取决于基础的varchar大小?我认为索引基本上是一个哈希表算法,使它们在某种程度上独立于列内容? – 2011-02-15 03:38:41

0
  • SQLite:大小限制被完全忽略。
  • PostgreSQL:VARCHAR(N)基本上相当于TEXT CHECK (LENGTH(x) <= N)。声明最大大小没有性能优势。
  • MySQL:确定字符串长度是存储为一个字节还是两个字节。
  • Oracle:较高的大小限制有一个performance disadavantage
  • MS SQL Server:大于900字节的VARCHAR列无法建立索引。