mysql 全文索引 危害_mysql全文索引的限制与替代方案

mysql的全文索引只有一种方法判断相关性,就是词频,索引并不会记录匹配的词在字符串中的位置。并且,全文索引和数据量有较大的关系,全文索引只会全部在内存中时,性能才会很好,因此当全文索引过大,不能全部读入进内存,性能就会比较差。有以下几个例子:

1、修改一段文本中的100个单词时,需要索引100次。

2、全文索引的长度对性能的影响也是巨大的

3、全文索引会产生更多的碎片,需要更多的优化表(optimize table)操作

全文索引优化器的工作也并非和设想的一样,举例就是,

如果sql中包含match against,而索引列上又正好有全文索引,那么mysql就一定会使用全文索引,如果此时还有其他索引,mysql也不会去对比那个索引性能更高。

...where match(content) against(‘high performance’) and author = 123;

此时author列由普通索引,content列有全文索引,那么mysql一定会使用全文索引而不是普通索引,查询效果会很差。

替代方案就是,把author列加入到全文索引,然后在author列加上一个不常见的前缀,然后将这个带前缀的词放到一个单独的列filter中去维护。这样可以扩展全文索引,使其包含filter列。sql:

... where match(content,filter) against (‘high performance +author_id_123’ in boolean mode);

这么做的一个前提是author列的选择性要很高。那么mysql就会根据author过滤将数据限制在一个很小的范围中,然后再去匹配关键词,如果author本身的选择性就比较低,那么这个替代方案会比原方案更糟。

你可能感兴趣的:(mysql,全文索引,危害)