7

我正在优化MySQL 中的一些innodb 表,所以我运行了过程 analsye()来查看建议是什么。

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

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

4

4 回答 4

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 上,大小差异可以忽略不计。

于 2009-12-29T17:52:33.003 回答
1

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

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

于 2009-07-01T12:25:24.590 回答
1

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

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

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

于 2009-08-29T05:21:49.573 回答
0

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

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

于 2009-07-02T12:51:01.450 回答