由于写 LIKE '%xxx%'
需要全部遍历太慢了,所以试图来做全文索引。
看了MySQL的说明,可以有FULLTEXT索引,但用的过程出了一点问题,在此记录:
- FULLTEXT索引不是完全的子串匹配!!!只是模糊匹配!!!
- 中文分词问题:直接用
FULLTEXT KEY
是没有中文分词的!需要使用ngram,例如:create fulltext index b on try_table(file_path) with parser ngram
- 查询的时候,用
SELECT * FROM try_table where match(file_path) against('123北京') limit 100;
- FULLTEXT索引用上之后,反而比直接
LIKE '%xxx%'
更慢,可能因为被查询的词的出现次数太多了,也可能因为设置参数不好(ngram_token_size默认为2) ERROR 188 (HY000): FTS query exceeds result cache limit
:原因是缓存不足,可以调整innodb_ft_result_cache_limit(通过执行set GLOBAL innodb_ft_result_cache_limit=2000000000
设置) https://support.oracle.com/knowledge/Oracle%20Database%20Products/2439029_1.html- 关于字符串索引:如果只是
LIKE 'xxx%'
这样的前缀索引,直接用mysql的index还是很快的。但如果是子串匹配,会很慢。