索引名规范:ix_表名_字段名
语法:
create index 索引名 on 表名(字段名)
show index from 表名\G;
#创建全文索引
CREATE TABLE articles(
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT(title,body)
)engine = myisam charset=utf8;
#插入语句
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 well show ...'),
('MySQL Security','When configured properly,MySQL ...'),
('MySQL vs.YourSQL','In the following database comparison ...');
查看索引是否创建成功
show index from articles \G;
语法及使用索引查询
#语法
select * from 表名 where match(字段名,...) against('关键字');
#使用索引查询
select * from articles where match(title,body) against('database');
#使用explain分析sql语句
explain select * from articles where match(title,body) against('database');
“\G” 的作用是将查到的结构旋转90度变成纵向
explain select * from articles where match(title,body) against('database')\G;
如果你按照平时我们查关键字的方法模糊查询,是没有使用索引的,看下图;
#使用like关键字模糊查询
explain select * from articles where body like 'database%' \G;
查询文章表
然后使用索引查询关键字‘mysql’,看看有什么变化?
注意:这里查询关键字是不区分大小写的;
是不是很奇怪,分明有五条包含‘mysql’的内容,但为什么查出是空的?
接下来再看,关键字“database”在每一行出现的可能性:
select match(title,body) against('database') from articles;
分别在第一行与第五行,‘database’出现的几率为38%
作为对比,再来看,关键字“mysql”在每一行出现的可能性:
select match(title,body) against('mysql') from articles;
奇怪了,反而在每一行都出现的‘mysql’,出现的可能性竟为0。
关键字“mysql”没有创建索引,是因为:
这个关键字占全文50%的比例,所以不能创建索引。
1、 全文索引必须是myisam存储引擎。
2、 MySQL自己的fulltext是不支持中文的,用sphinx(coreseek)技术去处理中文。
3、 语法:match(字段,…) against (‘关键字’)
4、 在50%以上都出现的关键字,是不会做全文索引的,(这个特点就告诉我们,要做全文索引必须是海量数据)。这个词叫停止词(停止字)。