InnoDB 5.6 新特性之一:FullTEXT Indexes[1.简单介绍]
先来看一条SQL语句: SELECT * FROM aa where acol like '%like_normal%';
当我们使用Innodb时,无论如何对这条语句进行优化,都是无意义的;有的人会说,对于这种情况先建议采用MyISAM 表来存储,不错,MyISAM确实是个不错的选择;但是我们这个表不仅只有这一列数据,还有其他列呢,开发又说了,对于这个表的数据需要保证一定的事物性,额怎么办?
看到这种变态的SQL,首先想到的办法就是建议开发该逻辑,做缓存,或者直接使用ES,收索引擎等东东;因为这种SQL在MySQL 里边是个头疼的问题,在MySQL5.6以前是不用考虑任何索引机制能够用的上。
好消息就是MySQL5.6版本,加入了这一新特性 InnoDB FULLTEXT Index 东东,简单的来说就是个全文索引,它可以对你指定的表的 TEXT,CHAR,VARCHAR 建立全文索引,注意!! 不是我们说的一般的索引,或者前缀索引的,是全文索引。
问题来了, 什么叫全文索引呢?相信接触过MyISAM、搜索引擎、Lucen 的人对全文索引并不陌生,简而言之,全文索引就是对你的这个文件中每个单词建立一个索引,通过这个单词建立的索引,我们可以快速的找到,这些单词在什么地方。
好了,有了全文索引的基本概念以后呢,我们来看看MySQL InnoDB 的全文索引是怎么实现的,废话少说,直接来试验看结果吧:
我们首先创建一个表:
CREATE TABLE test_fullindex ( id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, aname char(200) DEFAULT NULL, bname text, cname varchar(400) );
表建好了以后呢, 我们就可以给它添加一些索引了,为了进行对比,我们添加两个索引:
alter table test_fullindex add fulltext idx_aname_bname(aname,bname); 注意这里有个Warning !!!,稍微我们在说。
alter table test_fullindex add index idx_bname_cname_idx(bname(20),cname(20));
注意建立全文索引的语法和普通索引的语法不一样!
看一下表结构:
mysql> show create table test_fullindex\G
*************************** 1. row ***************************
Table: test_fullindex
Create Table: CREATE TABLE `test_fullindex` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`aname` char(200) DEFAULT NULL,
`bname` text,
`cname` varchar(400) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_bname_cname_idx` (`bname`(20),`cname`(20)),
FULLTEXT KEY `idx_aname_bname` (`aname`,`bname`)
) ENGINE=InnoDB AUTO_INCREMENT=6095778 DEFAULT CHARSET=utf8mb4
Ok, 到目前为止我们的基础表已经建好了,然后我们就开始去发现全文索引的神秘吧:
一般来说,我们都会打开innodb_file_per_table 这个选项的,理由不言而喻。而我们也知道,对于表上的索引是存储在该表的表空间上的,但是对于这个全文索引,就不是这么一回事了,我们去搂一把数据文件一看究竟哈:
-rw-rw---- 1 dba dba 96K Mar 29 23:16 FTS_0000000000000015_0000000000000018_INDEX_1.ibd
-rw-rw---- 1 dba dba 72M Mar 30 00:02 FTS_0000000000000015_0000000000000018_INDEX_2.ibd
-rw-rw---- 1 dba dba 23M Mar 30 00:02 FTS_0000000000000015_0000000000000018_INDEX_3.ibd
-rw-rw---- 1 dba dba 27M Mar 30 00:02 FTS_0000000000000015_0000000000000018_INDEX_4.ibd
-rw-rw---- 1 dba dba 40M Mar 30 00:02 FTS_0000000000000015_0000000000000018_INDEX_5.ibd
-rw-rw---- 1 dba dba 96K Mar 29 23:16 FTS_0000000000000015_0000000000000018_INDEX_6.ibd
-rw-rw---- 1 dba dba 96K Mar 29 23:16 FTS_0000000000000015_BEING_DELETED_CACHE.ibd
-rw-rw---- 1 dba dba 96K Mar 29 23:16 FTS_0000000000000015_BEING_DELETED.ibd
-rw-rw---- 1 dba dba 96K Mar 30 00:02 FTS_0000000000000015_CONFIG.ibd
-rw-rw---- 1 dba dba 96K Mar 29 23:16 FTS_0000000000000015_DELETED_CACHE.ibd
-rw-rw---- 1 dba dba 96K Mar 29 23:16 FTS_0000000000000015_DELETED.ibd
-rw-rw---- 1 dba dba 8.5K Mar 29 23:43 test_fullindex.frm
-rw-rw---- 1 dba dba 2.1G Mar 30 00:05 test_fullindex.ibd
一看这玩意儿,就惊呆了, 刚才我们明明就只建了一个表,为什么多了这么多ibd文件呢?这些文件是从哪里来的呢?
于是我们连上数据库,查一下这个表就知道了:
mysql> select TABLE_ID,NAME,FLAG,SPACE ,ROW_FORMAT from information_schema.innodb_sys_tables where name like '%test/%';
先看几个转换: 21 = 0x15 ;24 = ox18
从这里我们也可以看出,这些几个文件(FTS_*)就是存的全文索引的数据文件,这些文件呢是由系统统一管理,统一命名的,其命名方式相信你已经看明白了。没错,我们的系统会为每张表和每个索引分配一个id,拿到这个ID转换成16进制然后就可以拼接成我们全文索引表的名字,系统默认会给这个全文索引建上6个表,其中的值按照hash分布,这6个表也就是我们上边看到的 FTS_****_***_INDEX_* 了,然后还有几个额外的表,其中有 DELETE字段和CONFIG字段的,这个我们稍后讨论。
好了,我们现在知道了全文索引是怎么存储的了, 以及它直观的表现形式,下面来看看怎么个使用这个FULLTEXT吧。
FULLTEXT的使用比较简单,语法也比较好理解,我们可以使用 SELECT * FROM TEST_FULLINDEX WHERE MATCH(…) AGAINST(…); 这种语法来查询我们想要的结果。
首先解释一下两个特殊字段的含义: MATCH() 这里需要指明你要用到的那个全文索引, 注意对于INNODB表来讲,这里的值就是你创建全文索引时指定的值,比如你在创建全文索引时用了一个字段(aname) 那么这里就应该这样写:MATCH(aname) ; 如果你在创建全文索引是用了两个字段 (aname,bname) 那么你就应该这样写:MATCH(aname,bname)。指定了查找哪个全文索引以后,我们就可以指定我们想查的条件了, 这个条件就是用 AGAINST() 来指定的。
关于AGAINST() , 这里有几种语法可以写:
第一种我们可以直接指定一个字符串,比如我要查找包含 “netease” 的单词, 那么我们可以直接写成 AGAINST('netease') 或者写成 AGAINST('netease' IN NATURAL LANGUATE MODE) 都可以, 注意这里是区分大小写的。
两个具体列子:
mysql> select * from test_fullindex where match(aname,bname) against('netease') limit 1;
mysql> select * from test_fullindex where match(aname,bname) against('netease' in natural language mode) limit 1;
+---------+-------+----------------+-------+
| id | aname | bname | cname |
+---------+-------+----------------+-------+
| 6095778 | net | netease nethot | hah |
+---------+-------+----------------+-------+
第二种:叫做BOLLEAN查找, 这种查找语法如下:
SELECT * FROM articles WHERE match(aname,bname) against('+netease -net' IN BOOLEAN MODE);
这种语法有3个关键字: + 代表 AND,- 代表 not , no 代表 OR;
OK , 基本的介绍就到这里,下面会介绍一下,FULLTEXT的内部细节的东西。
InnoDB 5.6 新特性之一:FullTEXT Indexes[1.简单介绍]的更多相关文章
- MySQL 8 新特性之Invisible Indexes
背景 索引是把双刃剑,在提升查询速度的同时会减慢DML的操作.毕竟,索引的维护需要一定的成本.所以,对于索引,要加上该加的,删除无用的.前者是加法,后者是减法.但在实际工作中,大家似乎更热衷于前者,而 ...
- 【转】10.4新特性-ArcGIS 10.4矢量切片介绍
原文地址:http://zhihu.esrichina.com.cn/article/567 1.矢量切片简介GIS的底图一直使用金字塔技术进行切图,使用户能够快速访问指定级别的地图或者影像.但是切图 ...
- C++ 11新特性:std bind 原理简单图解(转载)
本文解释了bind 是如何工作的.为了清晰,我对图中的语法作了一些简化(例如,省略函数调用操作符的参数类型),并且简化了 bind 的实现. bind 可以用来将用户提供的需要一个参数的函数转换成不需 ...
- MySQL5.7的新特性
MySQL 5.7版本据说已经在了很大的性能提升以及做得更加安全了,想了解更多MySQL 5.7的新特性可以参考我转载叶金荣老师的MySQL 5.7的新特性说明.这里我简单演示一下MySQL 5.7的 ...
- mysql5.7新特性探究
一.MySql5.7增加的特性 1.MySql服务方面新特性 1) 初始化方式改变 MySql5.7之前版本初始化方式: scripts/mysql_install_db MySql5.7版本初始化方 ...
- 返璞归真 asp.net mvc (7) - asp.net mvc 3.0 新特性之 Controller
原文:返璞归真 asp.net mvc (7) - asp.net mvc 3.0 新特性之 Controller [索引页][源码下载] 返璞归真 asp.net mvc (7) - asp.net ...
- 返璞归真 asp.net mvc (8) - asp.net mvc 3.0 新特性之 Model
原文:返璞归真 asp.net mvc (8) - asp.net mvc 3.0 新特性之 Model [索引页][源码下载] 返璞归真 asp.net mvc (8) - asp.net mvc ...
- Java 新特性(2) - JDK6 新特性
http://freesea.iteye.com/blog/160133 JDK6的新特性之一_Desktop类和SystemTray类 JDK6的新特性之二_使用JAXB2来实现对象与XML之间的映 ...
- 从零开始一起学习SLAM | C++新特性要不要学?
LAM,C++编程是必备技能.不过,大家在学校里学习的书本一般比较老,主要还是C++98那些老一套. 本文所谓的C++新特性是指C++11及其以后的C++14.C++17增加的新关键字和新语法特性.其 ...
随机推荐
- 成都Uber优步司机奖励政策(4月14日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- centos7安装cacti
参考博客地址:https://blog.csdn.net/kenn_lee/article/details/80565385 Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络 ...
- idea里绝对不要直接复制文件到项目中的另一处
否则那样会将使用被复制文件的那些地方 文件名会变成复制后的那个 而路径是原来的 所以会导致找不到文件 所以绝对不要直接复制文件或者包或者目录到项目中的另一处 需要时应该新建文件 把代码复制进去 这种事 ...
- 我们一起学习WCF 第三篇头消息验证用户身份
前言:今天我主要写的是关于头消息的一个用处验证用户信息 下面我画一个图,可以先看图 第一步:我们先开始做用户请求代码 首先:创建一个可执行的上下文对象块并定义内部传输的通道 using (Operat ...
- C# 多线程的等待所有线程结束的一个问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...
- java nio实现文件复制
public class TransferTo { public static void main(String[] args) throws Exception { FileChannel in = ...
- linux系统CPU内存磁盘监控发送邮件脚本
#!/bin/bashexport PATHexport LANG=zh_CN.UTF-8###top之后输入数字1,可以查看每颗CPU的情况.###先配置好mailx邮箱账号密码:#cat>/ ...
- bootstrap form样式及数据提交
1.基本form布局 想要把form表单弄成两列的表格样式,奈何前端不太懂,记录下样式便于下次使用. form-group :增加盒子的下边界 form-control: 充满整个父元素,并且有换行作 ...
- 第四篇 Postman之Pre-request Script(前置处理器:JS之 YYYY-MM-DD HH:MM:SS)
本篇来讲讲Pre-request Script 前置处理器,定义在发送request之前需要运行的一些脚本,应用场景主要是设置全局变量和环境变量. 本例子也是项目中遇到的,需要修改与客户的预约时间,但 ...
- pyquery详细用法
python爬虫之PyQuery的基本使用 PyQuery库也是一个非常强大又灵活的网页解析库,如果你有前端开发经验的,都应该接触过jQuery,那么PyQuery就是你非常绝佳的选择,PyQue ...