MySQL中那些难以捉摸的 %name% 查询

数据库查询的效率至关重要。特别是在处理大量数据时,一次简单的查询可能对性能产生深远的影响。

在上一小节,我们分享过优化%name。在众多查询类型中,%name% 这种模糊查询也尤为常见,同时也是优化的一个重点。这种查询模式在实际应用中极为普遍,无论是在客户服务系统中搜索客户记录,还是在电子商务平台上检索产品目录,都能看到它的身影。

但是,正是由于其“模糊”的特性,%name% 查询在执行时往往需要遍历大量数据,这在大型数据库中可能导致显著的性能瓶颈。

特别是在这种情况下,普通索引是无法发挥作用的。

面对这一挑战,如何优化这类查询,既保证数据检索的准确性,又提高查询的效率,成为了数据库管理员和开发者必须面对的课题。

通常,面对这种查询,我们一般会选择将MySQL的数据同步至ES中,ES更适合处理大量数据的文本搜索且响应速度快。在MySQL中我们怎么优化了?这时候我们可以用MySQL全文索引。

需要注意的是,如果字段内容为中文,那么我们需要使用ngram插件去解析。

可以通过下面的命令查看插件的状态:

show plugins;
MySQL中那些难以捉摸的 %name% 查询

🚀 查询案例

比如我们现在有一张users 表,表结构和数据情况如下图:

CREATE TABLE `users` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(255NOT NULL,
  `password` varchar(255NOT NULL,
  `email` varchar(255NOT NULL,
  `category` varchar(255NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `full_name` varchar(256DEFAULT NULL,
  PRIMARY KEY (`id`)
ENGINE=InnoDB AUTO_INCREMENT=4000003 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

数据

MySQL中那些难以捉摸的 %name% 查询

查询需求:

假如我们需要查询 full_name 字段中包含葛之的数据。

select count(*) from users where full_name like '%葛之%';
MySQL中那些难以捉摸的 %name% 查询

可以看到,由于模糊查询,该查询会进行全表扫描,总耗时大约需要2.126秒

🎳  全文索引创建

接下来,我们在full_name上创建全文索引,并且使用ngram解析。

create fulltext index idx_full_name on users (full_name) with parser ngram;

我们知道MySQL的普通索引和聚簇索引都在同一个ibd里面,但是全文索引会额外地创建索引文件,如下。

MySQL中那些难以捉摸的 %name% 查询

索引创建好之后,我们进行再次查询。

select count(*)  
from users  
where match(full_name) against('+葛之' in boolean mode);

可以看到,本次查询执行时间为123ms

MySQL中那些难以捉摸的 %name% 查询

详细的执行计划对比如下,%葛之%模糊查询由于全表扫描造成很高的成本花费。

MySQL中那些难以捉摸的 %name% 查询

那如果我们执行下面的查询,会得到什么结果呢?

select count(*)  
from users  
where match(full_name) against('+葛' in boolean mode);

结果是0。原因可以自己思考下哈哈。是不是可以调整token或者最小分词大小等呢? 会不会引发查询optimizing的问题呢?

本文就是简单的介绍了下使用ngram中文解析,使用全文索引解决模糊匹配的问题,没有太深入地介绍原理和细节。

实践中,理想的解决方案往往需要在索引的全面性、搜索的准确度以及系统性能之间找到恰当的平衡。数据库管理员和开发者需要考虑特定的数据集特性、查询需求以及系统资源,从而做出明智的配置选择。记住,没有一种方法是适用于所有场景的,灵活性和适应性是关键。

在处理中文全文搜索时,我们还需要特别注意分词器的选择和配置。中文与西方语言在结构上的根本不同要求我们采取更细致、更适合的分词和索引策略。此外,实验和调优是必不可少的步骤,通过不断地测试和调整,我们能够找到最适合我们数据和业务需求的解决方案。

最后,随着技术的不断进步,我们期待着数据库和搜索引擎在处理中文及其他复杂语言方面的持续改进。作为数据库专家,我们应当保持对新技术的好奇心和学习热情,不断探索和应用最新的方法,以便更好地解决全文搜索中遇到的各种挑战。

在数据的海洋中探索,寻找信息的针尖,是一项既充满挑战又极具回报的任务。随着我们技术的不断精进和对数据本质的深入理解,无疑,我们将能够更有效地驾驭这个充满信息的世界。


原文始发于微信公众号(小新数据库):MySQL中那些难以捉摸的 %name% 查询

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/207529.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!