在MySQL 5.7版本中,针对千万级数据进行LIKE ‘%关键词%’模糊搜索时,性能低下是常见问题。由于无法利用索引,查询效率会显著下降。本文探讨如何在不增加服务器资源(内存、外部中间件)的前提下,优化MySQL模糊搜索的效率。
已知尝试过MySQL分词索引和自定义索引表,但因中文分词复杂性和索引维护成本而放弃。内存缓存方案也因Java堆内存(512M)限制而不可行。
解决方案:构建类似倒排索引的辅助表
一个有效的方案是创建辅助索引表,类似于倒排索引。该表存储每个词语与其后一个词语,以及对应的原始记录主键ID。
例如,对于记录“MySQL千万级数据量如何一秒内实现模糊搜索?”,索引表结构如下:
当前词 | 下一词 | 原记录主键ID |
---|---|---|
MySQL | 千万级 | 1 |
千万级 | 数据量 | 1 |
数据量 | 如何 | 1 |
… | … | … |
模糊 | 搜索 | 1 |
搜索 | NULL | 1 |
搜索“模糊搜索”时,sql语句如下:
SELECT 原记录主键ID FROM (SELECT 原记录主键ID FROM 索引表 WHERE 当前词 = '模糊' AND 下一词 = '搜索') a JOIN (SELECT 原记录主键ID FROM 索引表 WHERE 当前词 = '搜索' AND 下一词 IS NULL) b USING(原记录主键ID);
通过索引表快速定位包含关键词的记录,再根据主键ID获取原始数据,避免全表扫描,显著提升效率。
注意事项:
此方案需要预先构建和维护索引表,并根据实际情况调整表结构和SQL语句。复杂搜索条件可能需要更复杂的索引表和查询逻辑。 类似的倒排索引技术也应用于例如everything软件的高效搜索中,但其具体实现更为复杂。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END