对于MySQL中的innodb表,哪个更快:varchar(255)还是tinytext?

时间:2009-07-01 12:15:33

标签: mysql optimization innodb varchar tinytext

我在MySQL中优化了一些 innodb表,所以我运行 procedure analsye()来查看推荐内容。

对于之前设置为varchar(255)的所有字段,结果建议 tinytext而不是varchar(255)

使用 tinytext 可以获得性能提升吗?我只关心这里的速度,而不是尺寸。

4 个答案:

答案 0 :(得分:6)

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

实际差异是:

  • TINYTEXT和其他TEXT字段与MySQL堆内的内存行分开存储,而VARCHAR()字段加起来限制为64k(因此在TINYTEXT中可以有超过64k,而你不会VARCHAR)。

  • TINYTEXT和其他“blob-like”字段将强制SQL层(MySQL)在使用它们时使用磁盘上的临时表,而VARCHAR仍将在“内存中”排序(尽管将转换为CHAR为全宽)。

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

我通常更喜欢VARCHAR(255) - 它们不会对单行造成太多的堆碎片,并且可以在MySQL内存中作为单个64k对象处理。在InnoDB上,大小差异可以忽略不计。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

人们过去常常使用tinytext,因为varchar(令人讨厌)修剪了尾随的空白。在MySQL 5.0中删除了此行为。

(*至少对于前768个字节,并且内置InnoDB,而不是新的InnoDB插件)。

答案 3 :(得分:0)

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

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