如何优化ThinkPHP中大字段ThinkPHPText的存储与查询?
- 内容介绍
- 文章标签
- 相关推荐
本文共计756个文字,预计阅读时间需要4分钟。
大段落(TEXT、BLOB、JSON)必须和主表分离,否则一查就拖整条SQL。 这不是加索引能解决的,是数据物理布局和MySQL执行机制决定的——只要SELECT里包含TEXT字段,何必只取1行,MySQL就可能放弃内存临时表,转而写磁盘临时表,IO直接翻倍。
TEXT 字段为什么会让查询变慢
MySQL 对大字段的处理很“实在”:它不会像普通字段那样走内存缓存,而是按需从磁盘读取完整内容。一旦 SQL 中出现 SELECT * 或没限制字段的 select(),哪怕你模板里只用 $user->name,数据库仍要把 content、description 这类字段整个捞出来、序列化、传网络、PHP 再解析——三重浪费。
- 宽表 + TEXT 字段 → 容易触发
Using temporary; Using filesort - 分页查 20 条,每条带 100KB content → 光传输就多占 2MB,Redis 缓存体积也跟着膨胀
-
ORDER BY或GROUP BY涉及 TEXT 字段 → 索引完全失效,必走全表扫描
怎么把 TEXT 字段从主查询里摘出去
核心原则:列表页、聚合页、搜索页,一律不查大字段;只在详情页按需加载。
本文共计756个文字,预计阅读时间需要4分钟。
大段落(TEXT、BLOB、JSON)必须和主表分离,否则一查就拖整条SQL。 这不是加索引能解决的,是数据物理布局和MySQL执行机制决定的——只要SELECT里包含TEXT字段,何必只取1行,MySQL就可能放弃内存临时表,转而写磁盘临时表,IO直接翻倍。
TEXT 字段为什么会让查询变慢
MySQL 对大字段的处理很“实在”:它不会像普通字段那样走内存缓存,而是按需从磁盘读取完整内容。一旦 SQL 中出现 SELECT * 或没限制字段的 select(),哪怕你模板里只用 $user->name,数据库仍要把 content、description 这类字段整个捞出来、序列化、传网络、PHP 再解析——三重浪费。
- 宽表 + TEXT 字段 → 容易触发
Using temporary; Using filesort - 分页查 20 条,每条带 100KB content → 光传输就多占 2MB,Redis 缓存体积也跟着膨胀
-
ORDER BY或GROUP BY涉及 TEXT 字段 → 索引完全失效,必走全表扫描
怎么把 TEXT 字段从主查询里摘出去
核心原则:列表页、聚合页、搜索页,一律不查大字段;只在详情页按需加载。

