MySQL:FTS query exceeds result cache limit

今天线上收集的错误日志中显示一个错误:

FTS query exceeds result cache limit

意思是:全文索引查询执行结果超出了缓存限制。

配置介绍

通过查询发现与innodb_ft_result_cache_limit配置项有关,解释如下:

这个配置项从官方文档上看是MySQL5.7.2引入,但是MySQL5.6的版本已经有了这个配置项。设置最大值的时候有一些区别。

默认值:2,000,000,000字节。

最大值:在MySQL5.7.4之后,最大值为2^32 - 1。在MySQL5.7的后续版本,如果设置的值超过了系统最大值会产生警告,并且自动截断为最大值。而在之前的版本则不会警告也不会截断。 注:5.7.2,5.7.3版本不同。

最小值:1,000,000字节。

这个配置项存储的是InnoDB每个全文索引查询结果的缓存限制(定义为字节)。Intermediate and final InnoDB full-text search query results are handled in memory(不明白什么意思)。如果是百万行及以上的大表,使用这个配置项设置全文索引查询结果缓存大小来避免过度的内存消耗。内存在全文索引查询执行的时候分配。如果缓存限制被超出,一个指示“查询消耗了允许的最大内存”错误被返回。

问题与解决办法

线上数据为75万左右,配置使用的默认值,产生错误的原因是用户搜索的时候使用了一个非常长的文章,上千个单词。因为MySQL的全文搜索匹配的是单个词,文章越大执行的匹配操作也就越多,所以就产生了这个问题。

解决办法可以限制用户输入,也可以适当调大配置项的值,毕竟这个功能用户较少,适当调大没什么影响。

(完)