MySQL TEXT字段性能

Jon*_*hon 4 mysql optimization

我在1000个MySQL表中的每个表中都有几个TEXT和/或MEDIUMTEXT字段.我现在知道TEXT字段在查询时写入磁盘而不是内存.即使在查询中没有调用该字段,这也是正确的吗?例如,如果我有一个包含2个字段(id int(11)和注释文本)的表(tbExam)并运行SELECT id FROM tbExam,MySQL是否仍然必须在返回结果之前将其写入磁盘,否则它将运行该查询在记忆中?

我试图找出是否需要重新配置我们的实际数据库表以切换到varchar(xxxx)或保留文本字段并重新配置查询.

Qua*_*noi 22

我现在知道TEXT字段在查询时写入磁盘而不是内存

TEXT仅当查询需要临时表来存储多个排序或聚合操作的中间结果时,才会将字段写入磁盘.这一点,例如,发生在你混合DISTINCT,ORDER BYGROUP BY在一个查询中的不同列.

如果您的TEXT列不是此临时表的一部分,MySQL将首先尝试使用MEMORY引擎(不支持TEXT)创建它.

MyISAM只有当此表的大小超出@@tmp_table_size或者某些列MEMORY不支持时,才会选择临时表的引擎.

对于这样的查询:

SELECT  id
FROM    tbExam
Run Code Online (Sandbox Code Playgroud)

,根本不需要临时表.

存在如何稍有差别InnoDB的存储引擎插件(它负责之间的相互作用InnoDBMySQL)相对于行为TEXTVARCHAR字段:VARCHAR而一个字段被传递到记录缓冲器由值TEXT字段被通过引用传递.

在内部,InnoDB存储TEXTVARCHAR字段以相同的方式:如果整列适合页面的一半,则为行内,否则为行外.上述差异仅涉及InnoDB / MySQL交互问题.

如果您不查询这些字段,则根本没有区别.