我正在优化MySQL中的一些innodb表,所以我运行过程analsye()以查看建议是什么。对于MySQL中的innodb表,它更快:varchar(255)或tinytext?
结果推荐TINYTEXT,而不是为varchar(255)对先前设置为varchar的所有字段(255)
是否有性能增益通过使用TINYTEXT哪儿来?我只关心速度而不是规模。
我正在优化MySQL中的一些innodb表,所以我运行过程analsye()以查看建议是什么。对于MySQL中的innodb表,它更快:varchar(255)或tinytext?
结果推荐TINYTEXT,而不是为varchar(255)对先前设置为varchar的所有字段(255)
是否有性能增益通过使用TINYTEXT哪儿来?我只关心速度而不是规模。
不要相信是否有人告诉你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的大小差异可以忽略不计。
我希望varchar比tinytext快,从我的谷歌搜索似乎是普遍的共识。当然你必须测试你的系统才能真正确定。
它更快的原因是因为当MySQL执行某些操作(连接,排序等)时,它通常会创建临时表。在临时表中有BLOB类型(如tinytext)时,该表将基于磁盘而不是基于内存,这当然会对性能产生影响。
你可能也想看看使用char(255)
- 虽然它确实占用了更多的空间,但在以后进行比较时,使用大小恒定的字段的速度要快得多(根据我的经验)。如果您只是在寻找速度,那么额外的空间可以填充填充,然后稍后忽略空白。
但是,注意:MySQL不允许varchar
和char
类型存在于同一个表中。它也不[通常]允许在varchar
和char
之间进行比较。去年我在一个业余爱好project的桌子实施中发现了这一点。
at http://www.informit.com/articles/article.aspx?p=377652&seqNum=3,我读到了innodb表格,最好使用varchar:“内部行存储格式不处理固定长度和可变长度列不同(所有行使用包含指向列值的报头),所以使用固定长度CHAR列本身不是本质上比使用可变长度VARCHAR列” – 2009-07-03 10:15:02
有趣简单 - 不争议的制品,只是那一直是我的经验..虽然我可能一直在使用MyISAM – warren 2009-07-03 23:52:25
CHAR/VARCHAR会更快,因为这些列与主行数据*存储在同一页面中,而TEXT类型存储在页面
(我错了,请参阅Harrison的评论)。
人们过去使用tinytext很多,因为varchar(令人讨厌地)修剪尾随空白。这个行为在MySQL 5.0中被删除了。
(*至少第一个768字节,内置InnoDB,而不是新的InnoDB插件)。
我只是想,在内存中会有一个blob指针,只有访问blob才会导致一个磁盘命中,并且只能用于该表的一部分? – 2009-07-02 13:04:50