2009-07-01 70 views

回答

6

不要相信是否有人告诉你TINYTEXT是以其他方式存储的,而不是VARCHAR。

实际的差别是:

  • TINYTEXT和其他文本字段从内存行分开存储的MySQL堆里面,而VARCHAR()场加起来64K的限制(所以你可以有一个以上在TINYTEXT中是64K,而你不会用VARCHAR)。如果TINYTEXT和其他类似blob的字段强制SQL层(MySQL)在使用磁盘临时表时使用,而VARCHAR仍将在内存中排序(尽管将被转换为CHAR为全宽)。

  • InnoDB内部并不关心它是tinytext还是varchar。验证非常容易,创建两个表格,一个使用VARCHAR(255),另一个使用TINYINT,并向两者插入一条记录。它们都将采用单个16k页面,而如果使用溢出页面,TINYTEXT表格应该显示为在“SHOW TABLE STATUS”中至少需要32k。

我通常喜欢VARCHAR(255) - 它们不会导致太多的堆碎片为单列的,并且可以被视为在MySQL中存储一个64K的对象。 InnoDB的大小差异可以忽略不计。

1

我希望varchar比tinytext快,从我的谷歌搜索似乎是普遍的共识。当然你必须测试你的系统才能真正确定。

它更快的原因是因为当MySQL执行某些操作(连接,排序等)时,它通常会创建临时表。在临时表中有BLOB类型(如tinytext)时,该表将基于磁盘而不是基于内存,这当然会对性能产生影响。

+0

我只是想,在内存中会有一个blob指针,只有访问blob才会导致一个磁盘命中,并且只能用于该表的一部分? – 2009-07-02 13:04:50

0

你可能也想看看使用char(255) - 虽然它确实占用了更多的空间,但在以后进行比较时,使用大小恒定的字段的速度要快得多(根据我的经验)。如果您只是在寻找速度,那么额外的空间可以填充填充,然后稍后忽略空白。

但是,注意:MySQL不允许varcharchar类型存在于同一个表中。它也不[通常]允许在varcharchar之间进行比较。去年我在一个业余爱好project的桌子实施中发现了这一点。

+0

at http://www.informit.com/articles/article.aspx?p=377652&seqNum=3,我读到了innodb表格,最好使用varchar:“内部行存储格式不处理固定长度和可变长度列不同(所有行使用包含指向列值的报头),所以使用固定长度CHAR列本身不是本质上比使用可变长度VARCHAR列” – 2009-07-03 10:15:02

+0

有趣简单 - 不争议的制品,只是那一直是我的经验..虽然我可能一直在使用MyISAM – warren 2009-07-03 23:52:25

1

CHAR/VARCHAR会更快,因为这些列与主行数据*存储在同一页面中,而TEXT类型存储在页面 (我错了,请参阅Harrison的评论)。

人们过去使用tinytext很多,因为varchar(令人讨厌地)修剪尾随空白。这个行为在MySQL 5.0中被删除了。

(*至少第一个768字节,内置InnoDB,而不是新的InnoDB插件)。

相关问题