MySQL使用like查询使用索引情况及fulltext索引

最近有个功能需要使用到模糊查询,当时我也不想使用lucene来做,所以就像直接使用MySQL的like查询就可以了。于是就在这个字段上面建了个索引,但是印象中我记得好像like查询是不能使用索引的,所以我这里做了个实验。结果如图:

like使用索引

我相信上图已经非常直观的给出答案了,我就不多解释了。

如果需要实现模糊查询怎么办,这时我们需要使用到fulltext索引,但是需要注意只有MyISAM这个引擎的MySQL才能支持,而且对中文支持不好,主要是中文分词,因为我这里都是查询的一些标签而且都是用逗号分隔所以查询起来效果还可以,如果是用来文章检索,还是看看有什么插件或者使用其他方法了。

如果使用fulltext查询不到结果那么可能有以下几个问题:

  1. 你的数据库引擎不对
  2. 中文分词
  3. MySQL有一个设置:ft_min_word_len这个是最短的索引字符串,默认为4,如果查询的字符串小于这个值,也查下不到
  4. 如果你的关键词频率超过了50%,使用默认的查询方式(自然语言)是查询不到的,需要好似用IN BOOLEAN MODE模式才可以查询到

索引更多姿势:http://www.cnblogs.com/lyhabc/p/3776739.html

fulltext姿势:http://www.cnblogs.com/macula7/archive/2011/05/18/2050525.html

最后的意外:修改ft_min_word_len的时候,注意ft_min_word_len=1是放到[mysqld]后面的不要放到[mysql]后面哦。

再附加一些小知识:

重建索引:REPAIR TABLE table_name QUICK;
查询某个表的索引:SHOW INDEX FROM table_name;

本来我想使用Hibernate提供的fulltext来查询的,不过使用Hibernate来查询fulltext好像还是要使用到lucene,文章:http://hibernate.org/search/documentation/getting-started/,所以我还是使用原生态的SQL查询吧。

如果有哪位大侠知道如何使用Hibernate或者JPA查询fulltext,亦或者知道怎么使用注解fulltext的可以Mail我。

MySQL有个插件可以支持中文:mysqlcft