Msql修改like全模糊匹配方案-全文索引

本文介绍了如何使用MySQL的全文索引和ngram分词器优化大表的模糊查找性能。当数据量增大时,普通的LIKE查询会导致全表扫描,性能下降。通过创建全文索引并使用ngram分词器,可以实现对手机号码这类纯数字字段的高效模糊匹配。添加全文索引后,查询语句改为使用MATCH() AGAINST(),从而提高查询效率。
摘要由CSDN通过智能技术生成

Msql修改like全模糊匹配方案-全文索引

作者版本时间
3134101641.02021-7-21

背景

当前存在表:

CREATE TABLE `user` (
  `uid` bigint NOT NULL AUTO_INCREMENT COMMENT '用户编号',
  `name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '真实姓名',
  `mobile` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '手机号, 唯一',
  ... 省略其他字段
  PRIMARY KEY (`uid`) USING BTREE,
  UNIQUE KEY `USER_MOBILE` (`mobile`) USING BTREE COMMENT '手机号唯一索引'
) ENGINE=InnoDB AUTO_INCREMENT=20014 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

要求对mobile实现模糊查找

功能实现方案

SELECT * FROM `user` WHERE mobile like '%xxxx%'

该SQL在user表数据量小的时候,性能问题较小,随着数据量增大的时候,由于左模糊匹配MYSQL会走全表扫描,性能会急剧下降。

explain 查看SQL分析结果:

id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows |filtered|Extra      |
--+-----------+-----+----------+----+-------------+---+-------+---+-----+--------+-----------+
 1|SIMPLE     |u    |          |ALL |             |   |       |   |12617|   11.11|Using where|

改造方案 - 全文检索

Mysql对于大表的模糊查找,自身提供了一种全文检索[1]的方案。其中全文检索普通模式是按照英语的习惯做自然词拆分,以空格来界限词的开始和结束,最小分词大小由参数(最小ft_min_word_len默认4,最长词ft_max_word_len默认84)控制,在本例中,字段mobile记录的为手机号码,是11位纯数字,按照自然词拆分无法实现。

Mysql内置了ngram分词器[2],本身是用于非英语环境的分词。该分词器的分词大小不受默认分词的最小/最大分词大小控制,使用ngram_token_size,默认值2,同时该分词器会忽略空格。

这个参数意味着,默认情况下:

  • “ab cd"被解析为"ab”, “cd”
  • “a bc"被解析为"bc”

该分词器符合满足需求。

  1. 添加全文索引
ALTER TABLE `pumpkin-user-0801`.`user` ADD FULLTEXT INDEX user_mobile_IDX (mobile) WITH PARSER ngram;
  1. 查询SQL修改为:
SELECT * from `user` u where MATCH (mobile) against ('xxxx')
  1. explain 分析SQL,走全文索引
id|select_type|table|partitions|type    |possible_keys        |key                  |key_len|ref  |rows|filtered|Extra                        |
--+-----------+-----+----------+--------+---------------------+---------------------+-------+-----+----+--------+-----------------------------+
 1|SIMPLE     |u    |          |fulltext|user_mobile_ftext_idx|user_mobile_ftext_idx|0      |const|   1|   100.0|Using where; Ft_hints: sorted|

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值