首页 新闻 会员 周边

mysql 高效率的模糊查询

0
悬赏园豆:5 [已解决问题] 解决于 2020-03-03 09:06

在使用msyql进行模糊查询的时候,很自然的会用到like语句,通常情况下,在数据量小的时候,不容易看出查询的效率,但在数据量达到百万级,千万级的时候,查询的效率就很容易显现出来

在不引入全文检索控件的情况下,怎样做到高效率的模糊查询呢?
即怎样让模糊查询走索引呢?

问题补充:

使用instr,position,locate,FIND_IN_SET等等函数均没有实现走索引的需求

请赐教!!!

Mr_伍先生的主页 Mr_伍先生 | 初学一级 | 园豆:6
提问于:2019-12-02 13:13
< >
分享
最佳答案
0

你的问题好奇怪啊,你模糊查询查询的字段是索引的字段就走索引咯

收获园豆:5
小小咸鱼YwY | 老鸟四级 |园豆:3210 | 2019-12-02 13:35

事实却是我设置了这个字段是全文索引字段,但是使用like进行模糊查询的时候,还是全文检索

Mr_伍先生 | 园豆:6 (初学一级) | 2019-12-02 13:38

@Mr_伍先生: 首先你查的字段要是索引字段,模糊查询以什么什么结束是没有任何加速的

小小咸鱼YwY | 园豆:3210 (老鸟四级) | 2019-12-02 13:40

@小小咸鱼YwY: 能够确定的是,我查询的字段是索引字段,但是索引没有起作用

Mr_伍先生 | 园豆:6 (初学一级) | 2019-12-02 13:44

@小小咸鱼YwY:

Mr_伍先生 | 园豆:6 (初学一级) | 2019-12-02 13:45

@Mr_伍先生: 看你下面回答的,给你个优化方法删除索引,然字段变成普通字段

小小咸鱼YwY | 园豆:3210 (老鸟四级) | 2019-12-02 13:55

@Mr_伍先生: 你索引不起加速作用,你加索引反而会减速

小小咸鱼YwY | 园豆:3210 (老鸟四级) | 2019-12-02 13:57

@小小咸鱼YwY: 当然,这种思路是对的,但是作为一个普通字段的话,这种还是会全表查询,效率还是有问题的,之前没有加索引试过了,效果不是很理想;
加了所以也不理想,因为没有起作用

Mr_伍先生 | 园豆:6 (初学一级) | 2019-12-02 13:59

@Mr_伍先生: 那就优化表结构,横切竖切

小小咸鱼YwY | 园豆:3210 (老鸟四级) | 2019-12-02 14:00

@Mr_伍先生: 你把索引想象成就是在原先字段前面加一些字段,你如果索引不起作用,你再查询时候他先查索引再查内容,你这样加了索引反而变慢

小小咸鱼YwY | 园豆:3210 (老鸟四级) | 2019-12-02 14:02
其他回答(3)
0
  • 1、走不走 索引和你的函数没有关系
  • 2、想要走索引 你得先有索引, 索引添加
  • 3、模糊查询 只支持 最左前缀 即 like 'qq%' (已qq开头的数据) 才有可能走索引
xiaobaiskill | 园豆:1087 (小虾三级) | 2019-12-02 13:45

你上面所说的和我原先理解的是一样的,问题是现在我需要使用支持前后的模糊匹配 %XXX%,并且保证效率上不至于太差,所以才来看一下,各位有没有好的思路可以提供参考一下的....

支持(0) 反对(0) Mr_伍先生 | 园豆:6 (初学一级) | 2019-12-02 13:49

@Mr_伍先生: like 只支持最左前缀, %XXX% 是不会使用到索引的

支持(0) 反对(0) xiaobaiskill | 园豆:1087 (小虾三级) | 2019-12-02 13:52

@xiaobaiskill: 当然,也不一定说一定使用like这种写法,即模糊查询能够做到高效率,走索引就行...

支持(0) 反对(0) Mr_伍先生 | 园豆:6 (初学一级) | 2019-12-02 13:54

@Mr_伍先生: 你的这种模糊查询是不会 走索引的,就别想了. 其他的高效写法

支持(0) 反对(0) xiaobaiskill | 园豆:1087 (小虾三级) | 2019-12-02 13:59

@xiaobaiskill: 难道这种模糊查询,除了引入全文索引控件(分词器)以外,没有其他更好的办法吗?
这种业务场景应该比较常见的...

支持(0) 反对(0) Mr_伍先生 | 园豆:6 (初学一级) | 2019-12-02 14:02
0

如果需求允许的话,你写 like 'abc%',这样是走索引的。有时候这样也可以满足需求的,比如搜索引擎的自动提醒不就是从前往后匹配,如果需求要求匹配任意位置,那就不好搞了,我觉得全文索引可以有,不知道你为什么要排除全文索引。

会长 | 园豆:12401 (专家六级) | 2019-12-03 09:26

我需求匹配的是'%xxxxxx%'

举个例子吧
“我是中国人” “中国菜” “我来自中国” .....

检索出包含“中国” 的记录信息

支持(0) 反对(0) Mr_伍先生 | 园豆:6 (初学一级) | 2019-12-03 09:28

@Mr_伍先生: 除了全文索引,没有想到其它好办法。如果能提前预知关键词的话,也可以建立关键词和记录的连接。

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2019-12-03 09:30

@会长: 用户的这种关键词检索,没有办法提前预知

想请教一下,你指的全文索引指的是,使用like用法的话,是不走全文索引的...

支持(0) 反对(0) Mr_伍先生 | 园豆:6 (初学一级) | 2019-12-03 09:32

@Mr_伍先生: 就是这种全文索引: MySQL 之全文索引 。这个博文里是用MySQL自己的功能,需要切换下存储引擎,MySQL默认的Innodb是不支持全文索引的,此外也可以使用第三方的组件,不过我没用过,你可以百度下。

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2019-12-03 09:36

@会长: like写法的话,全文索引是没有效果的,引入第三方组件的话没有必要,感觉有点太重了,现在在思考怎样在现有的情况下,优化到最好

支持(0) 反对(0) Mr_伍先生 | 园豆:6 (初学一级) | 2019-12-03 09:43
0

博主解决了吗?我也遇到了和你一样的问题

~小孩 | 园豆:202 (菜鸟二级) | 2020-09-01 15:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册