0

0

mysql如何优化TEXT/BLOB字段的辅助查询_mysql外部哈希索引

P粉602998670

P粉602998670

发布时间:2026-03-04 11:29:02

|

956人浏览过

|

来源于php中文网

原创

text/blob字段不能直接建普通索引,因可能极大导致性能问题;必须指定前缀长度(如content(255)),但前缀索引不支持like '%xxx'、order by等;可用生成列+哈希(如sha2)建高效等值索引,或改用fulltext处理关键词搜索。

mysql如何优化text/blob字段的辅助查询_mysql外部哈希索引

TEXT/BLOB 字段为什么不能直接建普通索引

MySQL 对 TEXTBLOB 类型字段限制很死:除非指定前缀长度,否则不允许在它们身上建 INDEXUNIQUE 索引。这是因为这类字段可能极大,全量索引会严重拖慢写入、膨胀索引文件,甚至让 B+ 树结构失效。

你试过 ALTER TABLE t ADD INDEX idx_content(content)?大概率报错 ERROR 1170 (42000): BLOB/TEXT column 'content' used in key specification without a key length —— 这就是 MySQL 在拦你。

  • 只能加前缀索引,比如 ADD INDEX idx_content(content(255)),但 255 是字节数(非字符数),对 utf8mb4 实际最多覆盖 63 个汉字
  • 前缀索引无法支持 ORDER BYGROUP BYLIKE '%xxx' 这类无左前缀的查询
  • 如果业务常查内容中间或结尾的子串(比如日志里匹配 "error code: 500"),前缀索引完全无效

用生成列 + 普通索引模拟“外部哈希索引”

所谓“外部哈希索引”,不是真的在 MySQL 外面搭 Redis,而是用 MySQL 5.7+ 的 GENERATED COLUMN 把大字段哈希后存成整数或短字符串,再对这个生成列建高效索引。

核心思路:把模糊/全文匹配需求,降维成等值查询。例如查某段文本是否出现过,不扫 content 全文,而是查它的 SHA256 前 16 字节 —— 这个值可建 INDEX,查询飞快。

WPS灵犀
WPS灵犀

WPS灵犀是WPS推出的一款AI智能办公和学习助手

下载
  • 添加生成列:ALTER TABLE t ADD COLUMN content_hash CHAR(32) AS (SHA2(content, 256)) STORED
  • 立刻建索引:CREATE INDEX idx_content_hash ON t(content_hash)
  • 查询时改写为:SELECT * FROM t WHERE content_hash = SHA2('目标文本', 256)
  • 注意 STORED 是必须的(不能用 VIRTUAL),否则无法索引
  • 哈希碰撞概率极低,但业务上仍建议加一层 AND content = '目标文本' 做最终校验

什么时候该用全文索引而不是哈希

哈希适合「是否存在」的精确匹配,但如果你要搜关键词、支持分词、需要相关性排序(比如“mysql 优化 slow query”),FULLTEXT 是更正统的选择 —— 尤其在 InnoDB 表中已原生支持。

  • 建全文索引:ALTER TABLE t ADD FULLTEXT(content)(仅限 CHAR/VARCHAR/TEXT
  • 查询用:SELECT * FROM t WHERE MATCH(content) AGAINST('优化' IN NATURAL LANGUAGE MODE)
  • 注意:全文索引默认忽略少于 4 字符的词(ft_min_word_len=4),且停用词表会影响结果
  • 性能上,全文索引比 LIKE '%xxx%' 快得多,但比哈希索引慢一个数量级;写入开销也明显更高
  • 不支持中文分词(除非配 ngram 或使用第三方插件),纯靠空格/标点切分 —— 这是大多数踩坑的源头

别碰 LIKE '%xxx%',除非你确认数据量永远小于一万行

这是最常被当“捷径”用、实则最伤性能的操作。只要 LIKE 左边带通配符(%xxx),哪怕右边有索引,MySQL 也基本放弃走索引,退化为全表扫描。

  • 哪怕你给 content(500) 加了前缀索引,WHERE content LIKE '%error%' 依然不会用它
  • EXPLAIN 出来 type: ALLrows 接近表总行数?基本可以判定是这个原因
  • 替代方案只有三个:哈希列(等值)、全文索引(关键词)、或者把检索逻辑移到应用层(如用 Elasticsearch 同步内容)
  • 如果真要保留 LIKE,至少确保是左前缀形式:content LIKE 'ERROR:%',这样能用上前缀索引

哈希列方案看着绕,但上线后查一条从 2s 变成 20ms,这种收益是实打实的。真正容易被忽略的是哈希值存储长度和字符集 —— CHAR(32) 在 utf8mb4 下占 128 字节,而 BINARY(16) 存 MD5 更省空间,只是得用 HEX(MD5(content)) 配合,别搞混编码方式。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

683

2023.06.20

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

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

472

2023.06.21

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

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

286

2023.07.18

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

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

519

2023.07.19

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

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

265

2023.07.25

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

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

392

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

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

542

2023.08.11

mysql忘记密码
mysql忘记密码

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

665

2023.08.14

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

4

2026.03.04

热门下载

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

精品课程

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

共48课时 | 2.4万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 844人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号