【发布时间】:2009-07-01 12:15:32
【问题描述】:
我正在 MySQL 中优化一些 innodb 表,因此我运行了 procedure analsye() 来查看建议是什么。
对于之前设置为 varchar(255) 的所有字段,结果建议使用 tinytext 而不是 varchar(255)
使用 tinytext 是否有性能提升?我这里只关心速度,不关心大小。
【问题讨论】:
标签: mysql optimization innodb varchar tinytext
我正在 MySQL 中优化一些 innodb 表,因此我运行了 procedure analsye() 来查看建议是什么。
对于之前设置为 varchar(255) 的所有字段,结果建议使用 tinytext 而不是 varchar(255)
使用 tinytext 是否有性能提升?我这里只关心速度,不关心大小。
【问题讨论】:
标签: mysql optimization innodb varchar tinytext
如果有人告诉您 TINYTEXT 以 VARCHAR 以外的其他方式存储,请不要相信。
实际区别是:
TINYTEXT 和其他 TEXT 字段与 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/VARCHAR 会更快,因为这些列与主行数据存储在同一页面中*,而 TEXT 类型存储在页面外(我错了,请参阅 Harrison 的评论)。
人们过去经常使用 tinytext,因为 varchar(令人讨厌)修剪了尾随空格。此行为已在 MySQL 5.0 中删除。
(* 至少前 768 个字节,并且使用内置 InnoDB,而不是新的 InnoDB 插件)。
【讨论】:
您可能还想看看使用char(255) - 虽然它确实使用了更多空间,但在以后进行比较时使用恒定大小的字段(根据我的经验)要快得多。如果您只是在寻找速度,可以用填充来填充额外的空间,然后忽略空格。
但是,注意:MySQL 不允许varchar 和char 类型存在于同一个表中。它也 [通常] 不允许在 varchar 和 char 之间进行比较。我去年在为一个爱好 project 做表格实现时发现了这一点。
【讨论】: