在最近的一个项目须要实如今单表中对多字段进行多个关键字的模糊查询,但这数个关键字并不必定都存在于某个字段mysql
例如现有table表,其中有title,tag,description三个字段,分别记录一条资料的标题,标签和介绍。而后根据用户输入的查询请求,将输入的字串经过空格分割为多个关键字,再在这三个字段中查询包含这些关键字的记录。sql
可目前遇到的问题是,这些关键字是可能存在于三个字段中的任意一个或者多个,但又要求三个字段必须包含全部的关键词。若是分别对每一个字段进行模糊匹配,是无法实现所需的要求,由此想到两种方法:数据库
在插入记录的同时,将须要进行多字段模糊查询的字段合并成一个字串并加入到一个新的字段中,而后对这个新字段进行模糊查询。索引
使用全文检索,可是这须要用到中文分词或者将汉字转化为拼音(拆分汉字是不可行的,MySQL默认FT最小字节为4),并且并不利于从此的维护。ip
在网上爬了两天,对此问题的处理都没有找到满意的解决方法,最后在《MySQL权威指南》中翻到了CONCAT的使用方法,在书中的对CONCAT的描述是:字符串
CONCAT(str1,str2,…)
返回值:由全体出入参数合并在一块儿而获得的字符串。只要输入的参数中有NULL值,就返回NULL。CONCAT容许只有一个输入参数的状况。it
所以,前文的查询能够经过下面这个SQL查询实现
SELECT * FROM `magazine` WHERE CONCAT(`title`,`tag`,`description`) LIKE ‘%关键字%’io
在最近的一个项目须要实如今单表中对多字段进行多个关键字的模糊查询,但这数个关键字并不必定都存在于某个字段,查了一下有点收获
select * from table where `字段`='值' and concat(`title`,`content`) like '%关键字%'table
今天有朋友问select
引用原文:
请教一个问题:
我在mysql中建一个表,三百多万条记录,大约200mb大小,简单的模糊查询就很慢,请问有什么解决办法吗??也许 col_XX 会达到20个左右.
他的SQL以下:
1 select * from table_XX where col_1 like '%条件%' or col_2 like '%条件%' or col_3 like '%条件%'or col_4 like '%条件%'
首先,须要说明的是,以上的SQL语句,在任何类型的数据库上执行都不会使用到索引,意味着逐行扫描。
数据库只能作如下:
在建好联合索引 col_1,col_2.....后,
1 select * from table_XX where col_1 like '条件%' or col_2 like '条件%' or col_3 like '条件%'or col_4 like '条件%'
在必须以col_1做为where第一个条件的前提下,以上条件能使用到索引,也就是说最前面不能用%,只能以“条件”开头.
若是必定要实现 like '%条件%' ,数据库没法作到。
如下是实现的可选方案:
使用Lucene对须要检索的字段作全文检索(再加入本身的分词组件)。经过Lucene进行搜索(搜索效果要比数据库好得多),而非数据库。