做开发或者写数据库查询的时候,你有没有遇到过这种情况:某个字段存的是大段文字,比如用户评论、文章内容,类型是 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 能不能建索引?能,但得讲究方法。别一股脑全索引,也别指望普通索引解决所有模糊查询。根据你的使用场景选对策略,才能真正提升查询效率。