text类型可以创建索引吗?别再被长文本坑了

做开发或者写数据库查询的时候,你有没有遇到过这种情况:某个字段存的是大段文字,比如用户评论、文章内容,型是 text,结果想按关键词查,一执行就慢得像卡住了一样?这时候你可能会问:text 类型到底能不能建索引

直接说答案:能建,但有坑

大多数主流数据库,比如 MySQL、PostgreSQL,都允许给 text 字段创建索引,但不是直接全字段索引。因为 text 通常用来存储很长的内容,如果整个字段都拿去建索引,那索引文件会大到离谱,反而拖垮性能。

以 MySQL 为例,InnoDB 引擎对索引字段长度有限制,最大支持 767 字节(扩展后可到 3072),所以你不能直接对一个 longtext 字段建完整索引。

怎么办?用前缀索引

你可以只对 text 字段的前一部分建索引。比如,你想查文章标题相关的关键词,可以只取前 100 个字符:

CREATE INDEX idx_content_prefix ON articles(content(100));

这样既能加快 LIKE 'xxx%' 这类前缀匹配的查询,又不会让索引太大。但注意,如果是 LIKE '%xxx' 这种后缀或包含查询,前缀索引就帮不上忙了。

更聪明的办法:加个摘要字段

实际项目中,很多人会额外加一个 varchar 字段,比如 summary 或 keywords,把 text 里的关键信息提取出来,然后对这个短字段建索引。

ALTER TABLE articles ADD COLUMN search_keywords VARCHAR(255);
CREATE INDEX idx_keywords ON articles(search_keywords);

插入数据时,程序自动从 content 里抽几个关键词塞进去。这样一来,搜索效率高,索引也小,维护起来不费劲。

终极方案:用全文索引

如果你真要搜 text 里的任意词,比如“找出所有提到‘人工智能’的文章”,那就别折腾普通索引了,直接上全文索引。

MySQL 支持这样建:

CREATE FULLTEXT INDEX idx_content_fulltext ON articles(content);

然后用 MATCH AGAINST 查询:

SELECT * FROM articles 
WHERE MATCH(content) AGAINST('人工智能' IN NATURAL LANGUAGE MODE);

这比 LIKE 配合 % 快得多,也更适合文本内容检索。

所以,text 能不能建索引?能,但得讲究方法。别一股脑全索引,也别指望普通索引解决所有模糊查询。根据你的使用场景选对策略,才能真正提升查询效率。