SQL全文索引是数据库针对长文本字段设计的特殊索引类型,主要用于解决大文本数据的模糊查询性能问题,传统的LIKE '%关键词%'查询无法使用普通索引,数据量较大时查询耗时极长,而全文索引可以通过分词技术快速定位匹配的内容。
全文索引的适用场景
全文索引适合以下场景使用:
- 需要对文章、新闻、产品描述等长文本字段做关键词检索
- 模糊查询的数据量超过十万级,普通LIKE查询性能无法满足需求
- 需要支持多关键词组合检索、相关性排序的场景
MySQL中全文索引的创建与查询实例
创建全文索引
MySQL从5.6版本开始支持InnoDB引擎的全文索引,创建时可以直接在建表语句中添加,也可以对已有表添加索引。
首先创建测试表:
-- 创建文章表
CREATE TABLE article (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(100) NOT NULL,
content TEXT NOT NULL,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
给content字段添加全文索引:
-- 添加全文索引,索引名为idx_content_fulltext ALTER TABLE article ADD FULLTEXT INDEX idx_content_fulltext (content);
如果是建表时直接创建,可以写成:
CREATE TABLE article (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(100) NOT NULL,
content TEXT NOT NULL,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
FULLTEXT INDEX idx_content_fulltext (content)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
全文索引查询
MySQL使用MATCH...AGAINST语法查询全文索引,支持自然语言模式和布尔模式。
自然语言模式查询示例,检索content中包含数据库关键词的记录:
-- 插入测试数据
INSERT INTO article (title, content) VALUES
('SQL基础教程', '本文介绍SQL的基本语法和常用操作,适合初学者学习数据库知识'),
('全文索引使用指南', '讲解如何在MySQL中创建和使用全文索引,提升文本检索效率');
-- 自然语言模式查询
SELECT id, title, content
FROM article
WHERE MATCH(content) AGAINST('数据库');
布尔模式支持更灵活的条件,比如必须包含某个词、排除某个词:
-- 查询content中必须包含SQL,且不能包含初学者的记录
SELECT id, title, content
FROM article
WHERE MATCH(content) AGAINST('+SQL -初学者' IN BOOLEAN MODE);
SQL Server中全文索引的创建与查询实例
创建全文索引
SQL Server需要先创建全文目录,再基于目录创建全文索引,步骤如下:
首先创建测试表和全文目录:
-- 创建文章表
CREATE TABLE article (
id INT PRIMARY KEY IDENTITY(1,1),
title NVARCHAR(100) NOT NULL,
content NVARCHAR(MAX) NOT NULL,
create_time DATETIME DEFAULT GETDATE()
);
-- 创建全文目录
CREATE FULLTEXT CATALOG ft_catalog AS DEFAULT;
给content字段创建全文索引:
-- 创建全文索引,关联全文目录 CREATE FULLTEXT INDEX ON article(content) KEY INDEX PK_article ON ft_catalog WITH CHANGE_TRACKING AUTO;
全文索引查询
SQL Server使用CONTAINS或FREETEXT函数查询全文索引:
-- 插入测试数据
INSERT INTO article (title, content) VALUES
('SQL基础教程', '本文介绍SQL的基本语法和常用操作,适合初学者学习数据库知识'),
('全文索引使用指南', '讲解如何在SQL Server中创建和使用全文索引,提升文本检索效率');
-- 使用CONTAINS查询包含数据库的记录
SELECT id, title, content
FROM article
WHERE CONTAINS(content, '数据库');
-- 使用FREETEXT查询语义相关的记录,会自动扩展同义词
SELECT id, title, content
FROM article
WHERE FREETEXT(content, '数据库操作');
全文索引使用注意事项
- 全文索引对短文本字段效果有限,建议只对长度较长的文本字段创建
- MySQL全文索引默认最小分词长度是4个字符,太短的关键词可能无法匹配,可以通过修改配置调整
- 全文索引会占用额外的存储空间,创建前需要评估存储成本
- 数据更新频繁时,全文索引的维护会有一定性能开销,需要根据业务场景权衡是否使用
注意:不同数据库的全文索引语法和支持特性存在差异,实际使用时需要参考对应数据库的官方文档,本文实例仅作为通用参考。