在使用msyql进行模糊查询的时候,很自然的会用到like语句,通常情况下,在数据量小的时候,不容易看出查询的效率,但在数据量达到百万级,千万级的时候,查询的效率就很容易显现出来
在不引入全文检索控件的情况下,怎样做到高效率的模糊查询呢?
即怎样让模糊查询走索引呢?
使用instr,position,locate,FIND_IN_SET等等函数均没有实现走索引的需求
请赐教!!!
你的问题好奇怪啊,你模糊查询查询的字段是索引的字段就走索引咯
事实却是我设置了这个字段是全文索引字段,但是使用like进行模糊查询的时候,还是全文检索
@Mr_伍先生: 首先你查的字段要是索引字段,模糊查询以什么什么结束是没有任何加速的
@小小咸鱼YwY: 能够确定的是,我查询的字段是索引字段,但是索引没有起作用
@小小咸鱼YwY:
@Mr_伍先生: 看你下面回答的,给你个优化方法删除索引,然字段变成普通字段
@Mr_伍先生: 你索引不起加速作用,你加索引反而会减速
@小小咸鱼YwY: 当然,这种思路是对的,但是作为一个普通字段的话,这种还是会全表查询,效率还是有问题的,之前没有加索引试过了,效果不是很理想;
加了所以也不理想,因为没有起作用
@Mr_伍先生: 那就优化表结构,横切竖切
@Mr_伍先生: 你把索引想象成就是在原先字段前面加一些字段,你如果索引不起作用,你再查询时候他先查索引再查内容,你这样加了索引反而变慢
你上面所说的和我原先理解的是一样的,问题是现在我需要使用支持前后的模糊匹配 %XXX%,并且保证效率上不至于太差,所以才来看一下,各位有没有好的思路可以提供参考一下的....
@Mr_伍先生: like 只支持最左前缀, %XXX% 是不会使用到索引的
@xiaobaiskill: 当然,也不一定说一定使用like这种写法,即模糊查询能够做到高效率,走索引就行...
@Mr_伍先生: 你的这种模糊查询是不会 走索引的,就别想了. 其他的高效写法
@xiaobaiskill: 难道这种模糊查询,除了引入全文索引控件(分词器)以外,没有其他更好的办法吗?
这种业务场景应该比较常见的...
如果需求允许的话,你写 like 'abc%'
,这样是走索引的。有时候这样也可以满足需求的,比如搜索引擎的自动提醒不就是从前往后匹配,如果需求要求匹配任意位置,那就不好搞了,我觉得全文索引可以有,不知道你为什么要排除全文索引。
我需求匹配的是'%xxxxxx%'
举个例子吧
“我是中国人” “中国菜” “我来自中国” .....
检索出包含“中国” 的记录信息
@Mr_伍先生: 除了全文索引,没有想到其它好办法。如果能提前预知关键词的话,也可以建立关键词和记录的连接。
@会长: 用户的这种关键词检索,没有办法提前预知
想请教一下,你指的全文索引指的是,使用like用法的话,是不走全文索引的...
@Mr_伍先生: 就是这种全文索引: MySQL 之全文索引 。这个博文里是用MySQL自己的功能,需要切换下存储引擎,MySQL默认的Innodb是不支持全文索引的,此外也可以使用第三方的组件,不过我没用过,你可以百度下。
@会长: like写法的话,全文索引是没有效果的,引入第三方组件的话没有必要,感觉有点太重了,现在在思考怎样在现有的情况下,优化到最好
博主解决了吗?我也遇到了和你一样的问题