在 MySQL 中,文本字段(如 TEXT、LONGTEXT)由于长度较大,无法直接创建普通索引。但可以通过以下几种方式优化文本字段的索引,提升查询性能。
使用前缀索引
对于较长的文本字段,可以只对字段的前 N 个字符建立索引,减少索引大小,提高效率。
说明:前缀索引适用于字符串开头具有区分度的场景,比如文章标题、URL 等。
语法示例:CREATE INDEX idx_title ON articles(title(50));
这表示对 title 字段的前 50 个字符创建索引。选择合适的前缀长度是关键,太短会导致重复多,太长则索引体积大。
可通过以下语句评估前缀选择性:
SELECT COUNT(DISTINCT LEFT(title, 50)) / COUNT(*) FROM articles;
值越接近 1,说明前缀区分度越高,效果越好。
使用生成列 + 索引
如果需要基于文本内容的部分信息查询(如关键词、哈希值),可以创建虚拟生成列并为其建立索引。
场景示例:存储文章摘要的 MD5 值用于去重判断。
ALTER TABLE articles ADD title_md5 VARCHAR(32) AS (MD5(title));
CREATE INDEX idx_title_md5 ON articles(title_md5);
这样可以在不索引全文的情况下,快速通过哈希值定位记录。
使用全文索引(FULLTEXT)
当需要实现关键词搜索功能时,前缀索引不再适用,应使用 FULLTEXT 索引。
它支持 MATCH() ... AGAINST() 查询,专为文本内容检索设计。
创建方法:CREATE FULLTEXT INDEX ft_content ON articles(content);
或建表时指定:
CREATE TABLE articles ( ..., FULLTEXT(content) );
查询示例:
SELECT * FROM articles WHERE MATCH(content) AGAINST('数据库优化' IN NATURAL LANGUAGE MODE);
注意:FULLTEXT 索引仅支持 InnoDB 和 MyISAM 引擎,且对分词有语言限制(中文需配合额外处理)。
合理使用数据类型和压缩
尽量避免使用过大的文本类型。若内容较短,优先使用 VARCHAR 并设置合理长度,便于直接索引。
对于确实需要 TEXT 类型的字段,可考虑:
将大文本分离到单独表中,主表仅保留 ID 和摘要信息 启用 InnoDB 行格式压缩(ROW_FORMAT=COMPRESSED),减小 I/O 开销 应用层做内容分词,将关键词存入辅助字段并建立索引基本上就这些。关键是根据查询需求选择合适策略:前缀索引适合左匹配查询,生成列适合派生值检索,全文索引用于内容搜索。合理设计能显著提升文本字段的查询效率。
