我正在优化一些 innodb 表 在MySQL中,所以我跑了 过程分析() 看看有什么建议。

推荐结果 tinytext 代替 varchar(255) 对于之前设置为 varchar(255) 的所有字段

有没有 性能增益 通过使用而获得 小文本?我在这里只关心速度,而不关心大小。

有帮助吗?

解决方案

如果有人告诉您 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类型存储关闭页面(我错了,看到哈里森评论)。

人们使用,因为VARCHAR(烦人)修剪尾随空白使用TINYTEXT了很多。在MySQL 5.0除去此行为。

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

您可能也想看看使用char(255) - 虽然它确实使用更多的空间,它已经大大快(在我的经验)使用的字段是一定的大小后做比较时。额外的空间可填充填充,如果你正在寻找的不仅仅是速度,然后再忽略空白。

但是,请注意:MySQL不会允许varcharchar类型在同一表中存在。也不[通常]允许varcharchar之间的比较。我做一个表实现了爱好的项目

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top