【问题标题】:For innodb table in MySQL, which is faster: varchar(255) or tinytext?对于 MySQL 中的 innodb 表,哪个更快:varchar(255) 还是 tinytext?
【发布时间】:2009-07-01 12:15:32
【问题描述】:

我正在 MySQL 中优化一些 innodb 表,因此我运行了 procedure analsye() 来查看建议是什么。

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

使用 tinytext 是否有性能提升?我这里只关心速度,不关心大小。

【问题讨论】:

    标签: mysql optimization innodb varchar tinytext


    【解决方案1】:

    如果有人告诉您 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 上,大小差异可以忽略不计。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我只是假设内存中会有一个 blob 指针,只有访问 blob 才会导致磁盘命中,并且只针对表的那一部分?
      【解决方案3】:

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

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

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

      【讨论】:

      • InnoDB 不会在页面外存储所有 TEXT 类型。只有当一列超过 767 字节时,它才会将它们存储在页面外(即,某些行可能完全内联存储,其他行存储在外部)。由于 TINYTEXT 不能超过 767 字节的限制,因此它永远不会被存储在页面外。
      【解决方案4】:

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

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

      【讨论】:

      • informit.com/articles/article.aspx?p=377652&seqNum=3,我读到对于 innodb 表,最好使用 varchar:“内部行存储格式不会区别对待固定长度和可变长度列(所有行都使用标题包含指向列值的指针),因此使用固定长度的 CHAR 列本身并不比使用可变长度的 VARCHAR 列简单”
      • 有趣 - 不是对这篇文章提出异议,只是我的经验.. 虽然我可能一直在使用 MyISAM
      猜你喜欢
      • 2010-09-13
      • 1970-01-01
      • 2011-12-07
      • 2017-08-04
      • 2011-01-18
      • 2011-11-09
      • 2011-02-25
      相关资源
      最近更新 更多