Like查询优化

本文总结了左前缀匹配( LIKE '张三%')、右后缀匹配( LIKE '%张三')和模糊查询( LIKE '%张三%')常用优化方式。

测试数据生成 👉 MySQL快速生成大量测试数据(100万、1000万、1亿)

左前缀匹配

这种建普通索引就能优化:

create index idx_name on t(name);

优化效果显著。

右后缀匹配

原理:转化成左前缀匹配

实现:1. 新增字符倒置列 2. 生成列

1. 新增字符倒置列

具体做法是:在该表中增加 “name_back” 列,将 “name” 列的值倒置后,填入 “name_back” 列中,最后为 “name_back” 列增加索引。

ALTER TABLE t ADD name_back nvarchar(1000);-- 增加数据列
UPDATE t SET name_back = reverse(name); -- 填充 name_back 的值
CREATE INDEX t_like_name_back_idx ON t(name_back);-- 为 name_back 列增加索引

数据表调整之后,我们的 SQL 语句也需要调整:

SELECT * FROM t WHERE name_back LIKE '三张%'

2. 生成列

简介 👉 MySQL生成列

ALTER TABLE t ADD COLUMN reverse_name VARCHAR(200) GENERATED ALWAYS AS (REVERSE(name)); -- 生成列
ALTER TABLE t add INDEX idx_reverse_name(reverse_name); -- 建索引
SELECT * FROM t WHERE reverse_name LIKE '三张%'; -- 查询

模糊查询

原理:分词 + 倒排索引

实现方式:1. 手动分词 + 创建物理倒排索引表 2. 使用MySQL的fulltext全文索引 3. 上es

1. 手动分词 + 创建倒排索引表

👉 单表千万行数据库 LIKE 搜索优化手记

2. 使用MySQL的FULLTEXT

当涉及汉语,日语或韩语等表意语言语言时,这些语言不使用分词符。为了解决这个问题,MySQL提供了ngram全文解析器。自MySQL5.7.6版起,MySQL将ngram全文解析器作为内置的服务器插件。👉 MySQL ngram全文解析器

create fulltext index fulltext_idx_name on t(name); -- 建全文索引
SELECT * FROM t WHERE MATCH(name) AGAINST('张三'); -- 全文索引查询

3. 上es

底层基础lucene,专业做模糊查询。

版权

评论