- 点击上方“爱数据学习社”关注我们吧! -

文末领取【商业分析资料】

为什么要用全文索引

我们在用一个东西前,得知道为什么要用它,使用全文索引无非有以下原因:

  • like查询太慢、json字段查询太慢(车太慢了)

  • 没时间引入ElasticSearch、Solr或者Sphinx这样的软件,或者根本就不会用(无法将五菱宏光换成兰博基尼,即使有兰博基尼也不会开)

  • 加索引、联合索引啥的都已经慢得不行了(限速80,车顶盖都卸了也只能开到30)

  • 为了提升一下自己的格调(人家问你有没有开过法拉利,你说开过肯定更有气质一点)

什么是全文索引

简单的说,全文索引就相当于大词典中的目录,通过查询目录可以快速定位到想看的内容。

全文索引通过建立倒排索引来快速匹配文档(仅在mysql5.6版本以上支持),全文索引将连续的字母、数字和下划线当做一个单词,分割单词一般用空格/逗号/句号。

MySQL的全文索引支持以下3种查询模式:

  • 自然语言模式(IN NATURAL LANGUAGE MODE)
    通过MATCH AGAINST 传递某个特定的字符串来进行检索

  • 布尔模式(IN BOOLEAN MODE)
    支持操作符,例如+表示包含,-表示不包含

  • 扩展模式(WITH QUERY EXPANSION)
    相当于自然语言模式下的一个扩展,执行两次检索,第一次使用给定短语检索,第二次是结合第一次相关性比较高的行进行检索.

下面教大家如何创建全文索引,并创建测试数据演示三种查询模式的使用。

如何创建全文索引

1. 建表时指定

CREATE TABLE light_weight_baby (     id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,     title VARCHAR(200),     content TEXT,     FULLTEXT(title, content) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;

2. ALTER添加

ALTER TABLE table_name ADD FULLTEXT INDEX index_name (column1,column2,...);

3. CRATE INDEX添加

CREATE FULLTEXT INDEX index_name ON table_name (column1,column2,...);

创建测试数据

创建一个数据库用来演示这三种模式下的检索:

CREATE DATABASE chenqionghe DEFAULT CHARSET utf8;

创建一个文章表并插入测试数据

CREATE TABLE articles (    id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,    title VARCHAR(200),        body TEXT,    FULLTEXT (title,body)) ENGINE=InnoDB;

插入测试数据

INSERT INTO articles (title,body) VALUES    ('MySQL Tutorial','DBMS stands for DataBase ...'),    ('How To Use MySQL Well','After you went through a ...'),    ('Optimizing MySQL','In this tutorial we will show ...'),    ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),    ('MySQL vs. YourSQL','In the following database comparison ...'),    ('MySQL Security','When configured properly, MySQL ...');

执行结果如下

查询-使用自然语言模式

这是MySQL的默认查询模式,简单示例如下:

SELECT * FROM articles        WHERE MATCH (title,body)    AGAINST ('database' IN NATURAL LANGUAGE MODE);

可以看到,不区分大小写,title或body包含database的都返回了,另外,返回的结果将以相关性进行排序。

相关性:根据行中的字段、唯一单词的数量、集合中单词总数和包含特定单词的行数计算。

下面通过两种方式统计数量:

# 第一种方式 SELECT COUNT(*) FROM articles    WHERE MATCH (title,body)    AGAINST ('database' IN NATURAL LANGUAGE MODE);# 第二种方式SELECT   COUNT(IF(MATCH (title,body) AGAINST ('database' IN NATURAL LANGUAGE MODE), 1, NULL))    AS count    FROM articles;

第一种做了一些额外的工作(按相关性对结果进行排序),但也能使用索引进行查询。

第二种执行了全表扫描,如果搜索项出现在大多数行中,可能比索引查询更快。

匹配少数行,第一种快,匹配大多数行,第二种快。

下面演示如何检索相关性,但不会进行排序(因为不包含WHERE和ORDER BY)

SELECT id, MATCH (title,body)     AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE) AS score         FROM articles;

下面的示例更复杂,返回倒序后的相关性值,分别在SELECT和WHERE语句中使用了MATCH,但是不会导致额外的开销,因为mysql优化器注意到两次MATCH是相同的,只会使用一次全文搜索。

SELECT id, body, MATCH (title,body) AGAINST    ('Security implications of running MySQL as root'    IN NATURAL LANGUAGE MODE) AS score        FROM articles WHERE MATCH (title,body) AGAINST    ('Security implications of running MySQL as root'    IN NATURAL LANGUAGE MODE);

包含在("")中字符中的会被分解为单词,然后在全文索引中进行搜索,简单的说,就是进行OR查询。

查询-使用布尔模式(强大的语法)

使用布尔模式需要指定IN BOOLEAN MODE,不会自动根据相关性排序,一些字符具有特殊的含义,例如可以通过+或-表示一个单词必须存在或不存在。

下面的sql语句代表查询必须 包含MySQL但不包含YourSQL

SELECT * FROM articles WHERE MATCH (title,body)    AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);

语法:

示例:

查询-使用扩展模式

当搜索短语很短时非常有用,例如搜索database可能意味着MySQL、Oracle、DB2、RDBMS都要被匹配到,这就是这个模式能做的。

添加WITH QUERY EXPANSION或 IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION启用,它会执行两次检索,第一次使用给定短语检索,第二次是结合第一次相关性比较高的行进行检索。

例如下面的例子:

# 自然语言模式SELECT * FROM articles     WHERE MATCH (title,body)    AGAINST ('database' IN NATURAL LANGUAGE MODE);# 扩展模式SELECT *     FROM articles        WHERE MATCH (title,body)    AGAINST ('database' WITH QUERY EXPANSION);

可以看到第二条语句找到了包含MySQL的行,即使该行不包含database,但是因为在第一次的搜索中搜索引擎判断MySQL和database的相关性比较高,所以在执第二次搜索的时候返回了。

注意事项

  • 只能在类型为CHAR、VARCHAR或者TEXT的字段上创建全文索引

  • MATCH (字段) AGAINST (关键词),必须和创建时的字段一起,例如MATCH (light,weight,baby)使用的字段名与全文索引muscle(light,weight,baby)定义的字段名一致。如果只对单个字段查询,需要分别创建全文索引

  • 全文索引是以词为基础的,innodb_ft_min_token_size和innodb_ft_max_token_size用来设置单词的最大和最小长度,不在这个长度区间的将忽略

  • 在停用词stopwords中的将被忽略

  • 如果要导入大量数据,先导入数据再建全文索引,比先建全文索引再导入数据的方式快很多

  • 在MySQL 5.7.6之前,全文索引只支持英文全文索引,不支持中文全文索引,MySQL 5.7.6后内置了ngram全文解析器,支持中文、日文、韩文分词。

End.

作者:无涯

来源:博客园

本文为转载分享,如有侵权请联系后台删除

· 爱数据每周免费直播 ·

直播主题:留学生:海归如何做好职业生涯规划?

直播内容:

  • “四大”等咨询公司和外企是不是优选?

  • 留学生如何放大优势?

  • 如何更好的适应国内的工作环境?

直播时间:6月24日  周三晚20:30准时直播分享

mysql 中文字段名_MySQL全文索引怎么做?| 教程分享相关推荐

  1. php mysql 中文字段名_php mssql扩展SQL查询中文字段名解决方法

    一.问题: 数据库是MS SQLServer2000,要把SQLServer2000里的一张表的数据导入MySQL5,其中SQLServer2000表的字段以简体中文命名(强烈建议不要以中文做为字段名 ...

  2. mysql 中文字段名_10个MySQL的数据库技巧~

    一. 索引对数据库性能如此重要,如何使用它? 为数据库选择正确的索引是一项复杂的任务.如果索引列较少,则需要的磁盘空间和维护开销 都较少.如果在一个大表上创建了多种组合索引,索引文件也会膨胀很快. 而 ...

  3. 解决GeoTools中CQL解析中文字段名的问题

    GeoTools中CQL无法解析中文字段名的过滤条件,会报异常错误,经过一个下午的努力,终于通过简单有效的方式解决啦 String filterCondition = "temp='&quo ...

  4. mysql的like字段名_MySQL LIKE 字句使用详情

    MySQL LIKE 字句 我们知道在 MySQL 中使用 SQL SELECT 命令来读取数据, 同时我们可以在 SELECT 语句中使用 WHERE 子句来获取指定的记录. WHERE 子句中可以 ...

  5. mysql 字段 中文_如何配置mysql支持中文字段名与中文字段

    匿名用户 1级 2018-11-18 回答 中文字段名都可以了 但是中文记录不行 奇怪啊 mysql>; create table a (a char(20)); Query OK, 0 row ...

  6. mysql 联查字段名重复_查询数据库多个字段名时的结果有重复的解决办法_MySQL

    bitsCN.com 查询数据库多个字段名时的结果有重复的解决办法 查询数据库的结果有重复,怎么办? 在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关 ...

  7. 修改mysql表的字段名_mysql中修改表字段名/字段长度/字段类型详解

    在mysql中我们对数据表字段的修改命令只要使用alter就可以了,下面我来给大家详细介绍mysql中修改表字段名/字段长度/字段类型等等一些方法介绍,有需要了解的朋友可参考. 先来看看常用的方法 M ...

  8. php mssql扩展SQL查询中文字段名解决方法

    一.问题: 数据库是MS SQLServer2000,要把SQLServer2000里的一张表的数据导入MySQL5,其中SQLServer2000表的字段以简体中文命名(强烈建议不要以中文做为字段名 ...

  9. 初识mysql数据字段属性_MySQL数据库~~~~初识、基础数据类型

    一 数据库初识 1.1 什么是数据库 数据库(DataBase,简称DB),简而言之可视为电子化的文件柜----存储电子文件的处所,用户可以对文件中的数据运行新增,截取,更新,删除等操作. 所谓数据库 ...

最新文章

  1. codeforces 101466E Text Editor(hash)
  2. BM算法的shift1表是在所有情况下移动都是最快的吗?
  3. DIV + CSS 神话
  4. 从零开始编写自己的C#框架(14)——T4模板在逻辑层中的应用(三)
  5. STM32F7xx —— Timer
  6. c语言大数倍数,leetcode-1346(检查整数及其两倍数是否存在)--C语言实现
  7. 做了一个画f(x,y)=0函数图像的算法,果断codeplex之
  8. Python基础学习笔记之(二)
  9. 基于JAVA高校实习实训管理系统计算机毕业设计源码+数据库+lw文档+系统+部署
  10. 未来生活进行时: 畅想未来新兴技术40年——百大趋势性技术汇总(中)
  11. 又是一次数据分析的例子(自杀分析)
  12. GEE|影像可视化|导出分类结果图像
  13. 万网域名查询API接口
  14. 一个敷衍的开头。。。
  15. 虚拟机批量克隆工具_如何使用老毛桃winpe进行克隆磁盘?
  16. 章节专题2021-整合管理
  17. 焦作市宇华学校2021高考成绩查询,河南2021高考最高分多少分,河南历年高考状元资料...
  18. 基于74LS161实现的多功能数字钟
  19. 深入理解Seq2seq模型(Sequence2sequence)
  20. 【密码学|算法设计】拓展的欧几里得算法及理论证明 (Extended Euclidean Algorithm)

热门文章

  1. 四个你看后可能会影响你一生的故事
  2. 计算机风扇维修,教你简单修理电脑散热风扇
  3. php视频上传教程,PHP实现视频文件上传完整实例,_PHP教程
  4. 数据结构之线段树入门(单点更新区间查询)
  5. PAT_B_1006_Java(15分)
  6. jsp中两个double相乘_图像处理中的代数运算及几何变换
  7. 最小树形图+朱刘算法
  8. gsoap搭建WebService服务
  9. 什么是硬件设计?——成功的硬件设计需要什么?
  10. 千千万万的IT开发工程师路在何方?