在数据库使用中,DBA都会告诉大家SQL的LIKE条件为%XXX%号时,由于不能使用索引,当数据量变大时(比如超过百万条),全表扫描会导致性能很差。

但是在实际业务中,很难避免MySQL全文检索并Like索引的这种需求。比如模糊搜索用户帐号,昵称之类。既然这个需求必须做,但又不可以直接用LIKE。这里我和大家分享一下我们关于这种需求的一种解决方案。当然别人也可能采用过类似的办法,我不是很清楚。所以也用一下“原创”吧。

MySQL数据库很早就支持全文索引,但是全文索引和LIKE语句是不同的。具体点说,全文索引的单位是词,耳LIKE匹配的是字符。当然实际的区别更大,比如“老鼠爱大米”这段文本用全文搜索的话,条件“老鼠爱大米”,“老鼠和大米”,“大米老鼠”,“大米与老鼠”会搜索到内容,但是“爱”,“鼠爱”,“爱大”不会搜索到内容。反之,使用LIKE搜索时,“老鼠和大米”,“大米老鼠”,“大米与老鼠”不会找到内容,而“爱”,“鼠爱”,“爱大”会找到内容。我们这里不讨论两种方式的优劣,根据实际情况每种功能都会有各自的实际需求。比如对于大段文本,全文检索是最好的方法,但是对于姓名,帐号,昵称等很短的通常无意义文本,LIKE会更合适一些。

虽然全文检索和LIKE搜索不同,但是在特殊情况下,可以用全文搜索功能来实现LIKE搜索。具体就是每个字符作为一个词,而且使用双引号来限制词精确匹配(简单点说就是老鼠大米和大米老鼠不同),这样可以实现LIKE搜索的功能。

下面还是说一下具体的做法吧。

首先,数据库指定 --ft_min_word_len=2 --ft_stopword_file=""。第一个参数是告诉数据库,小于2个字符的词忽略。第二个是告诉数据库不忽略任何特殊词。这些设置是给实现功能创造条件。

然后建搜索表

CREATE TABLE tbl_search (

id int(10) unsigned NOT NULL auto_increment,

name varchar(500),

PRIMARY KEY (id),

FULLTEXT KEY idx_name (name)

) ENGINE=InnoDB AUTO_INCREMENT=1;

static String encode(String input) {

if (input == null) return null;

StringBuilder output = new StringBuilder();

for (int i = 0, c = input.length(); i < c; ++i) {

char ch = input.charAt(i);

if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z'

|| ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z'

|| ch == '_' || ch == '-') {

output.append(Integer.toHexString(ch)).append(' ');

} else if (ch >= 'a' && ch <= 'z' || ch >= 'a' && ch <= 'z') {

output.append(Integer.toHexString((int)ch - 32)).append(' ');

} else {

Character.UnicodeBlock block = Character.UnicodeBlock.of(ch);

if (block == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS

|| block == Character.UnicodeBlock.KATAKANA

|| block == Character.UnicodeBlock.HIRAGANA) {

output.append(Integer.toHexString(ch)).append(' ');

} else {

// do nothing

}

}

}

// trim blank

int last = output.length() - 1;

if (last > 0 && output.charAt(last) == ' ') {

output.deleteCharAt(last);

}

return output.toString();

}

使用上面的代码对要搜索的内容编码,比如内容是“蓝皮鼠2008”,编码后的结果是“84dd 76ae 9f20 32 30 30 38”。将编码后的内容存入name字段。使用如下SQL语句进行搜索

select * from tbl_search where match(name) against('"76ae 9f20 32"' in boolean mode)

这样就基本实现了MySQL全文检索中的Like索引。

mysql like全文检索_MySQL全文检索中Like索引的实现相关推荐

  1. mysql 全文检索_MySQL全文检索

    一.概述 MySQL全文检索是利用查询关键字和查询列内容之间的相关度进行检索,可以利用全文索引来提高匹配的速度. 二.语法 MATCH (col1,col2,...) AGAINST (expr [s ...

  2. mysql 8 全文检索_MySQL 8中使用全文检索示例

    首先建议张册测试用的表test,并使用fulltext说明将title和body两列的数据加入全文检索的索引列中: drop table if exists test; create table te ...

  3. mysql Ngram 全文索引_MySQL 全文检索 ngram Mybatis

    创建全文索引(FullText index) 创建表的同时创建全文索引 FULLTEXT (name) WITH PARSER ngram 通过 alter table 的方式来添加 alter ta ...

  4. mysql ngram 中文_MySQL 全文检索 ngram插件

    InnoDB默认的全文索引parser非常合适于Latin,因为Latin是通过空格来分词的.但对于像中文,日文和韩文来说,没有这样的分隔符.一个词可以由多个字来组成,所以我们需要用不同的方式来处理. ...

  5. mysql 统计条目_mysql 统计表中条目数量的几种方法

    mysql 统计表中条目数量的几种方法 展开 通常的方法是: select count(*) from `table_name` select count(1) from `table_name` s ...

  6. mysql支持非关系_说下oracle、mysql、非关系型数据库中的索引结构?

    谢邀~~树懒君悉心整理了一篇索引结构方面的内容,跟各位知友分享分享~ Oracle 索引的数据结构:B-TreeOracle 数据库使用 B-trees 存储索引,来加速数据访问.若没有索引,你必须顺 ...

  7. mysql hash创建_Mysql自适应哈希索引(Adaptive Hash Index)创建的条件

    官方文档: If a table fits almost entirely in main memory, a hash index can speed up queries by enabling ...

  8. mysql存储过程临时表_mysql存储过程中使用临时表

    当工作在很大的表上时,您可能偶尔需要运行很多查询获得一个大量数据的小的子集,不是对整个表运行这些查询,而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表可能更快些,然后多这些表运行查询. ...

  9. mysql 唯一编号_Mysql表中唯一编号的分配机制

    最近遇到一个问题:高并发环境下,如何避免MYSQL一张表里的某些列不要重复. 方式一:使用Mysql自带的列唯一索引(Unique) 可以在声明表的时候就加入这样一个约束(下面是mysql的语法): ...

最新文章

  1. uiwebview 读取本地html,UIWebView加载本地HTML文件
  2. C# xml通过xslt转换为html输出
  3. “sql2005管道的另一端上无任何进程”及附带一系列问题完整解决方法
  4. ESB文件调用,windows服务
  5. yii2史上最简单式安装教程,没有之一
  6. protobuf在java应用中通过反射动态创建对象
  7. Apollo进阶课程㉙丨Apollo控制技术详解——控制器的类型
  8. c++11并发指南系列
  9. 人人皆知Python功能,你还不了解嘛?
  10. Fleury算法 求欧拉回路
  11. [Erlang07] Erlang 做图形化编程的尝试:纯Erlang做2048游戏
  12. 网站压力测试工具webbench使用说明
  13. 安装docker遇到的坑
  14. MMO 游戏中使用多核
  15. 使用 className 修改样式属性
  16. 星起航:短视频营销之场景化
  17. U盘中毒文件都不见了
  18. alooa是华为什么型号_alooa是华为什么型号 华为alooa型号是华为畅享7Plus
  19. Cardboard Talk01 HeadTracker
  20. 国产处理器服务器操作系统安装(海之舟服务器操作系统安装说明)

热门文章

  1. 转 jdk8 jvm调优参数配置
  2. 关于mybatis返回值使用包装类型还是基本类型
  3. 论文阅读笔记——模式物种中个体的自动检测和识别
  4. 无人驾驶技术入门(一):百度无人驾驶的引路人
  5. mysql按升序创建索引_MySQL建立索引的基础规则
  6. docker三种网络模式
  7. python自学训练营 免费_李笑来《Python入门自学训练营》课程全集下载链接 | 挖宝否...
  8. 错误HikariPool-1 - Exception during..+ Access denied for user ‘root‘@‘localhost‘ (using password: YES)
  9. Spring自动装配注解
  10. 2015中学计算机考试题,郑加平的作业-初中信息技术考试题-2015年德阳市中小学教师教学评价技能提升全员培训-中国教师研修网...