[MYSQL]MySql 模糊查询LIKE优化(部分适用)
发布时间:2022-11-28 11:55:04 所属栏目:大数据 来源:
导读: mysql使用模糊查询时,如果数据量比较大mysql大数据查询优化,就会响应很长时间,严重影响效率。
一般的模糊查询:
SELECT?`column`?FROM?`table`?WHERE?`field`?like?'%keyword%';
一般的模糊查询:
SELECT?`column`?FROM?`table`?WHERE?`field`?like?'%keyword%';
|
mysql使用模糊查询时,如果数据量比较大mysql大数据查询优化,就会响应很长时间,严重影响效率。 一般的模糊查询: SELECT?`column`?FROM?`table`?WHERE?`field`?like?'%keyword%'; 即使对相应的字段建立索引也无济于事(用执行,根本没有触发索引,而是全表搜索)。 在网上查了一下,找到如下几种方法: 一、单个匹配符 SELECT?`column`?FROM?`table`?WHERE?`field`?like?'keyword%'; 这样写的好处是可以触发索引,提高查询效率,但只适用部分场景。 二、各种函数 1、()函数 SELECT?`column`?FROM?`table`?WHERE?LOCATE('keyword',?`field`)>0 2、()函数 SELECT?`column`?FROM?`table`?WHERE?POSITION('keyword'?IN?`filed`) 3、INSTR()函数 SELECT?`column`?FROM?`table`?WHERE?INSTR(`field`,?'keyword'?)>0 实际测试,这些函数并不能提高多少效率。? 最后,根据我的具体需求,想到了一种方法(并不适用所有场景,但能解决我遇到的问题) 先交代一下需求: 根据字段``(产品)、`TYPE`(类型)和`IDX`(流水号)查询`ID`(识别码)。 原本的SQL: SELECT?*?FROM?detail?WHERE?`IDX`?LIKE?'%TEST001%'?AND?PRODUCT?=?'Pad'?AND?TYPE=?'AAA' 这样便会遇到上文说到的情况,会全表查询,效率特别慢。 后来发现,在使用like时,在'%'前加一个字符串,便会触发索引,类似于: SELECT?*?FROM?detail?WHERE?`IDX`?LIKE?'T%EST001%' 这样查询效率会快很多。 因此mysql大数据查询优化,我在表中添加了一个字段``,这个字段是由字段``、`TYPE`的首字符和`IDX`组成的,例如 :Pad TYPE:AAA IDX: => : 。 优化后的代码如下: SELECT?*?FROM?detail?WHERE?`IDX`?LIKE?'P_A_%TEST001%' 这样写,会使用索引,提高查询效率。 其实不难发现,这样做就相当于把表中的数据,根据字段``、`TYPE`做了分类,减少了查询数量。 这也算是一种用空间换时间的办法。 最后附上更新表的代码: UPDATE?detail?SET?`SEARCH_ID`?=?CONCAT(SUBSTRING(PRODUCT?,1,1),'_',SUBSTRING(TYPE,1,1),'_',IDX) 写这个是为了方便以后自己翻看,欢迎指正,不喜勿喷。 (编辑:财气旺网 - 海宁网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐

