【MySQL】 索引优化实战:解决 WHERE 等值 + IS NULL 查询,TEXT 字段报错 1167 的完整指南

1. 核心查询与理想索引

  • 目标 SQL :SELECT ... FROM 表 WHERE 字段0 = 0 AND fail IS NULL;
  • 理想索引方案 :建立联合索引 (字段0, fail) 。因为在 MySQL 索引中,IS NULL 被视作一个特定的等值,联合索引可以完美匹配这两个查询条件。

2. 实际操作中遇到的障碍(报错 1167)

  • 报错信息 :1167 - The used storage engine can't index column 'fail'
  • 根本原因 :fail 字段的数据类型是 TEXT 。MySQL 不允许对 TEXT 或 BLOB 类型的字段创建完整索引,必须指定索引前缀长度。

3. 两种解决方案对比

方案 具体操作 优点 缺点 / 注意事项
方案一(强烈推荐) 修改 fail 字段类型为 TINYINT 或 INT (业务上通常表示布尔状态或计数),然后正常创建联合索引 (字段0, fail)。 性能最佳 :索引体积小、查询极快;符合数据库设计规范,避免滥用 TEXT。 修改大表字段类型会锁表,需在业务低峰期执行。
方案二(兜底方案) 保留 TEXT 类型,创建前缀索引 :(字段0, fail(100))。 无需改动表结构,能快速解决报错。 索引体积大、性能不如方案一;无法实现"覆盖索引"(需回表)。注意前缀长度需小于 767 字节(如 utf8mb4 下建议不超过 191)。

4. 最终结论与建议

  • 如果业务允许,请务必采用方案一 (改字段类型)。用 TEXT 存状态值属于设计失误,改掉它才是治本之策,后续所有相关查询都能受益。
  • 如果因特殊原因无法改表,采用方案二(前缀索引)作为临时或兜底措施,需接受其性能折损。
  • 操作完成后,务必用 EXPLAIN 验证,确保执行计划的 key 列显示为新索引,且 type 为 ref 或 range。
相关推荐
zyseo82 小时前
谷歌SEO 准首页词挖掘脚本:找出排在第 8-20 名的隐藏流量
大数据·数据库·人工智能
xiaogai_gai4 小时前
仅查询策略实战:从金蝶云·星空旗舰版定时拉取收料通知单
大数据·数据库·python
数据工匠老o4 小时前
异构数据库DDL同步:260条链路的结构变更自动适配方案
数据库·架构
L0014 小时前
MySQL5.7 DATE 字段无法设置默认日期?用触发器搞定|个人任务清单项目实战
mysql
这个DBA有点耶5 小时前
银行业市占率最高的国产数据库是谁?先搞清楚“市占率”的四种口径
数据库·程序员·架构
用户6279947182626 小时前
南大通用GBase 8a之基于审计日志的冷温热数据分析
数据库
数据库小学妹6 小时前
数据库运维五级成熟度:监控、备份、高可用怎么串起来
运维·数据库·监控
一个天蝎座的程序猿6 小时前
为了给报表提速,我把金仓KES的列存储折腾了个遍:聊聊KES的技术能力
数据库
飞越未来云城的霓虹飞猪6 小时前
AI 数据库地图:从 PostgreSQL 到向量数据库,一次看懂 AI 时代的数据底座
数据库
不像程序员的程序媛6 小时前
导出mysql数据结构
数据库·mysql