加入收藏 | 设为首页 | 会员中心 | 我要投稿 财气旺网 - 海宁网 (https://www.hainingwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

[MYSQL]MySql 模糊查询LIKE优化(部分适用)

发布时间:2022-11-28 11:55:04 所属栏目:大数据 来源:
导读:  mysql使用模糊查询时,如果数据量比较大mysql大数据查询优化,就会响应很长时间,严重影响效率。

  一般的模糊查询:

  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)
  写这个是为了方便以后自己翻看,欢迎指正,不喜勿喷。
 

(编辑:财气旺网 - 海宁网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!