如何优化ThinkPHP中大字段ThinkPHPText的存储与查询?

2026-04-28 23:071阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计756个文字,预计阅读时间需要4分钟。

如何优化ThinkPHP中大字段ThinkPHPText的存储与查询?

大段落(TEXT、BLOB、JSON)必须和主表分离,否则一查就拖整条SQL。 这不是加索引能解决的,是数据物理布局和MySQL执行机制决定的——只要SELECT里包含TEXT字段,何必只取1行,MySQL就可能放弃内存临时表,转而写磁盘临时表,IO直接翻倍。

TEXT 字段为什么会让查询变慢

MySQL 对大字段的处理很“实在”:它不会像普通字段那样走内存缓存,而是按需从磁盘读取完整内容。一旦 SQL 中出现 SELECT * 或没限制字段的 select(),哪怕你模板里只用 $user->name,数据库仍要把 contentdescription 这类字段整个捞出来、序列化、传网络、PHP 再解析——三重浪费。

  • 宽表 + TEXT 字段 → 容易触发 Using temporary; Using filesort
  • 分页查 20 条,每条带 100KB content → 光传输就多占 2MB,Redis 缓存体积也跟着膨胀
  • ORDER BYGROUP BY 涉及 TEXT 字段 → 索引完全失效,必走全表扫描

怎么把 TEXT 字段从主查询里摘出去

核心原则:列表页、聚合页、搜索页,一律不查大字段;只在详情页按需加载。

阅读全文
标签:ThinkPHPPHP

本文共计756个文字,预计阅读时间需要4分钟。

如何优化ThinkPHP中大字段ThinkPHPText的存储与查询?

大段落(TEXT、BLOB、JSON)必须和主表分离,否则一查就拖整条SQL。 这不是加索引能解决的,是数据物理布局和MySQL执行机制决定的——只要SELECT里包含TEXT字段,何必只取1行,MySQL就可能放弃内存临时表,转而写磁盘临时表,IO直接翻倍。

TEXT 字段为什么会让查询变慢

MySQL 对大字段的处理很“实在”:它不会像普通字段那样走内存缓存,而是按需从磁盘读取完整内容。一旦 SQL 中出现 SELECT * 或没限制字段的 select(),哪怕你模板里只用 $user->name,数据库仍要把 contentdescription 这类字段整个捞出来、序列化、传网络、PHP 再解析——三重浪费。

  • 宽表 + TEXT 字段 → 容易触发 Using temporary; Using filesort
  • 分页查 20 条,每条带 100KB content → 光传输就多占 2MB,Redis 缓存体积也跟着膨胀
  • ORDER BYGROUP BY 涉及 TEXT 字段 → 索引完全失效,必走全表扫描

怎么把 TEXT 字段从主查询里摘出去

核心原则:列表页、聚合页、搜索页,一律不查大字段;只在详情页按需加载。

阅读全文
标签:ThinkPHPPHP