<p>SELECT * 在含TEXT/JSON等长文本字段的表中会强制加载整行数据,导致IO和内存压力剧增,应显式指定所需字段以避免性能灾难。</p>为什么 SELECT * 在长文本字段上特别伤性能数据库读取行时,哪怕你只用其中一两个字段,只要表里有 TEXT 或 JSON 这类大字段,InnoDB 就得把整行(包括大字段)从磁盘或 buffer pool 里加载出来。尤其当这些字段平均几十 KB、又没被索引覆盖时,IO 和内存压力会指数级上升。常见错误现象:EXPLAIN 显示 type=ALL 或 Extra=Using where,但实际执行慢得离谱;监控看到 Innodb_buffer_pool_reads 暴涨;应用日志里反复出现超时却查不到明显锁等待。别在业务查询里写 SELECT *,尤其是表含 content、description、payload 等命名的大字段即使用了覆盖索引,如果索引没包含所有 SELECT 字段,MySQL 仍要回表------而回表会拉出整行,大字段照读不误TEXT 字段默认不参与索引,WHERE 条件里对它做 LIKE '%xxx%' 会强制全表扫描,顺便把所有大字段都拖一遍用 SELECT 显式指定字段替代 * 的实操要点这不是"建议",而是上线前必须卡住的红线。重点不是少写几个字,是让优化器能精确估算成本,并绕开大字段的物理读取。使用场景:分页列表、后台导出、API 接口响应组装------只要不需要展示全文内容,就该砍掉大字段。接口返回用户列表?只要 id、name、status,就明确写这三列,绝不要带 bio 或 resume导出报表需统计数量?用 SELECT COUNT(*) FROM t WHERE ...,别写 SELECT COUNT(id) 加大字段------COUNT(*) 走索引更快,且不触发回表真需要预览长文本?用 SUBSTRING(content, 1, 200) 或 LEFT(content, 200),避免传输和解析完整内容TEXT 字段建索引的坑:不是不能建,而是不能乱建TEXT 类型本身不支持全文索引以外的普通 B+Tree 索引,但很多人误以为加个 INDEX(content) 就能加速 WHERE content LIKE 'xxx%' ------ 实际会报错或静默降级为前缀索引,效果极差。 稿定AI 拥有线稿上色优化、图片重绘、人物姿势检测、涂鸦完善等功能
相关推荐
笨鸟先飞,勤能补拙1 小时前
AI 赋能网络安全:技术全景、成熟度评估与实战案例天桥下的卖艺者1 小时前
使用scitable包,两步生成逆概率删失权重(IPCW)隔窗听雨眠2 小时前
AI原生数据库浪潮:国产数据库的架构重构与路径之争长和信泰光伏储能2 小时前
京津冀光伏发电:绿色能源的未来之路数据库小学妹2 小时前
数据库选型实战:从数据类型到TCO成本,五维决策框架+九款产品横评浦信仿真大讲堂3 小时前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来Gu Gu Study3 小时前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)神龙天舞20013 小时前
MySQL 备库为什么会延迟好几个小时卷无止境4 小时前
写代码这件事,到底该讲究点什么?卷无止境4 小时前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂