如何处理MySQL中text/blob大字段导致的内存溢出及查询慢?

秋雪酱_9695

秋雪酱_9695

2026-06-13

199人浏览

原创

text/blob 字段本身不直接报 out of memory 错误,但会强制触发磁盘临时表、额外随机 i/o 和整页加载,导致内存被悄悄耗尽;根本原因是 mysql 的 memory 引擎不支持 text/blob,只要排序或分组涉及此类字段,即使 tmp_table_size 足够大也会落盘。

如何处理mysql中text/blob大字段导致的内存溢出及查询慢?

TEXT/BLOB 字段本身不会直接报 Out of memory 错误,但会让 MySQL 在排序、分组、临时表、全字段读取时悄悄吃光内存——根本原因是它们强制触发磁盘临时表、额外随机 I/O 和整页加载,而不是你配置的 sort_buffer_size 或 tmp_table_size 不够大。

为什么 ORDER BY 或 GROUP BY TEXT 会爆内存

MySQL 的 MEMORY 引擎压根不支持 TEXT/BLOB 类型。只要语句里出现 ORDER BY content、GROUP BY SUBSTRING(content, 1, 50),甚至 ORM 自动生成的 SELECT * FROM article ORDER BY created_at(哪怕没动 TEXT 字段),优化器也会直接放弃内存临时表,转而创建磁盘临时表。

  • 即使你把 tmp_table_size 和 max_heap_table_size 都设到 1G,照样落盘
  • EXPLAIN 显示 Using temporary; Using filesort,且 type 是 ALL 或 key 为 NULL,基本就是 TEXT 拖累的
  • 慢查询日志里 Rows_examined 远大于 Rows_sent,同时 Sort_merge_passes 持续上涨,说明正在反复读写磁盘临时文件

怎么确认某条记录真在用溢出页

不能只看字段类型是 TEXT 就断定用了溢出页;得结合行格式和实际内容长度判断。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • 运行 SHOW CREATE TABLE article\G,确认 ROW_FORMAT 是 DYNAMIC 还是 COMPACT(COMPACT 下超 768 字节就溢出)
  • 查真实长度:SELECT LENGTH(content) FROM article WHERE id = 123; —— 如果结果 > 8000 且格式是 DYNAMIC,基本进了溢出页
  • 观察 SHOW PROFILE FOR QUERY N 中的 Handler_read_rnd_next:值异常高,说明频繁跳页读取溢出数据
  • 不要依赖 INFORMATION_SCHEMA.INNODB_SYS_TABLES 查溢出页计数,它滞后且不准;优先用实际读取行为反推

绕开 TEXT 参与内存操作的实操写法

核心不是“压缩”或“截断”,而是让排序、分组、JOIN 完全脱离 TEXT 字段本体。

  • 把排序依据物化成独立列:ALTER TABLE article ADD content_updated_at DATETIME NOT NULL DEFAULT '1970-01-01',应用层同步更新,然后 ORDER BY content_updated_at
  • 对内容做轻量摘要并建索引:ALTER TABLE article ADD content_md5 CHAR(32) AS (MD5(content)) STORED, ADD INDEX idx_content_md5 (content_md5)
  • 绝对避免 ORDER BY UPPER(content) 或 GROUP BY JSON_EXTRACT(content, '$.title') —— 函数调用既无法走索引,又把 TEXT 拖进临时表
  • 查询时显式排除 TEXT:SELECT id, title, status FROM article WHERE ...,详情页再用 SELECT content FROM article_content WHERE id = ? 单独拉

垂直拆分时最容易被忽略的细节

拆表不是改个 DDL 就完事;最常出问题的是事务边界和缓存一致性。

  • 主表和内容表必须用同一事务更新,否则会出现“有头无身”:主表插入成功,内容表写入失败,后续 LEFT JOIN 返回 NULL
  • ORM 层要禁用自动 SELECT *,否则 JPA/Hibernate 仍会尝试映射已删除的字段,抛 SQLException 或静默丢数据
  • 备份脚本需同步处理两张表,否则恢复后外键关联断裂;mysqldump 要加 --skip-triggers --single-transaction 避免锁表
  • 如果旧数据要迁移,别用 INSERT INTO article_content SELECT id, content FROM article —— 大字段批量 INSERT 容易触发 max_allowed_packet 截断,必须分批次 + 应用层校验长度

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2133

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1319

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

755

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

2892

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

4828

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1099

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

5111

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

4522

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

5934

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 182人学习