【问题标题】:MySQL TEXT field performanceMySQL TEXT 字段性能
【发布时间】:2010-05-21 16:38:00
【问题描述】:

在我们的 1000 个 MySQL 表中,我有几个 TEXT 和/或 MEDIUMTEXT 字段。我现在知道 TEXT 字段在查询时写入磁盘而不是内存。即使在查询中没有调用该字段,这也是真的吗?例如,如果我有一个包含 2 个字段(id int(11) 和注释文本)的表 (tbExam),并且我运行 SELECT id FROM tbExam,那么 MySQL 是否仍然需要在返回结果之前将其写入磁盘,还是会运行该查询在内存中?

我想弄清楚是否需要重新配置我们的实际数据库表以切换到 varchar(xxxx) 或保留文本字段并重新配置查询。

【问题讨论】:

    标签: mysql optimization


    【解决方案1】:

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

    TEXT 字段仅在查询需要临时表来存储多个排序或聚合操作的中间结果时写入磁盘。例如,当您在单个查询中的不同列上混合 DISTINCTORDER BYGROUP BY 时,就会发生这种情况。

    如果您的TEXT 列不属于此临时表,MySQL 将首先尝试使用MEMORY 引擎(不支持TEXT)创建它。

    只有当临时表的大小超过@@tmp_table_size或有一些列MEMORY不支持时,才会选择临时表的MyISAM引擎。

    对于这样的查询:

    SELECT  id
    FROM    tbExam
    

    ,根本不需要临时表。

    InnoDB 存储引擎插件(负责 InnoDBMySQL 之间的交互)与 TEXTVARCHAR 字段的行为方式略有不同:VARCHAR 字段是通过值传递到记录集缓冲区,而 TEXT 字段通过引用传递。

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

    如果你不查询这些字段,那么根本没有区别。

    【讨论】:

    • 感谢您的详细回答。一旦我获得 15 点声望点并被允许,我会给你一分。
    猜你喜欢
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 2012-03-21
    相关资源
    最近更新 更多