MySQL使用MATCH AGAINST长唯一值(8.0.27)



我有一种情况,我们在数据库中存储长唯一id(最多200个字符),它们是单个TEXT条目。问题是我们使用FULLTEXT索引是为了提高速度,它对于较小的GUID样式条目非常有效。问题是它不适用于条目>由于innodb_ft_max_token_size的限制,它显然不能设置>84. 这意味着任何超过84个字符的条目都将从索引中省略。

样本条目(我需要匹配来自不同来源的实际数据):

AQMkADk22NgFmMTgzLTQ3MzEtNDYwYy1hZTgyLTBiZmU0Y2MBNDljMwBGAAADVJvMxLfANEeAePRRtVpkXQcAmNmJjI_T7kK7mrTinXmQXgAAAgENAAAAmNmJjI_T7kK7mrTinXmQXgABYpfCdwAAAA==

<j938ir9r-XfrwkECA8Bxz6iqxVth-BumZCRIQ13On_inEoGIBnxva8BfxOoNNgzYofGuOHKOzldnceaSD0KLmkm9ET4hlomDnLu8PBktoi9-r-pLzKIWbV0eNadC3RIxX3ERwQABAgA=@t2.msgid.quoramail.com>

["ca97826d-3bea-4986-b112-782ab312aq23","ca97826d-3bea-4986-b112-782ab312aaf7","ca97826d-3bea-4986-b112-782ab312a326"]

那么我有什么选择呢?是否有任何方法获得160(或左右)字符的唯一字符串与FULLTEXT索引工作?

对于没有空格的大字符串值(最多200个字符),我可以使用的最有效的索引是什么?

下面是评论中讨论的摘要:

id有多种格式,可以是一个最多200个字符的可变长度的单个标记,也可以是一个"数组"。是具有多个令牌的json格式文档。这些条目来自不同的来源,并且格式不在您的控制范围之内。

MySQL中的FULLTEXT索引实现的最大令牌大小为84个字符。无法搜索更长的令牌。

您可以使用传统的b树索引(不是FULLTEXT)来索引更长的字符串,在当前版本的MySQL中最多为3072字节。但这并不支持包含多个令牌的JSON数组。您不能使用b树索引来搜索字符串中间的单词。也不能使用带有LIKE谓词的索引来匹配在模式前面使用通配符的子字符串。

因此,要使用b树索引,必须每行存储一个令牌。如果接收到一个JSON数组,则必须将其拆分为单独的令牌,并将每个令牌单独存储在一行中。这意味着在将接收到的内容插入数据库之前,需要编写一些代码将其转换为id。

MySQL 8.0.17支持一种新的JSON数组索引,称为多值索引。如果您可以将所有令牌存储为JSON数组,即使是作为单个令牌接收的令牌,也可以使用这种类型的索引。但这也需要编写一些代码将id的单数形式转换为JSON数组。

底线是,如果您必须支持任何和所有格式,则没有单一的解决方案来索引文本。你要么不得不忍受未经优化的搜索,要么你需要找到一种方法来修改数据,以便你可以索引它。

  1. 新建表2列:一个VARCHAR(200) CHARSET ascii COLLATION ascii_bin(BASE64需要区分大小写)
  2. 在你的主表中,一个表可以有多个行。
  3. 使用一些简单的解析来查找表中的字符串(或字符串),并将它们添加到这个新表中。
  4. PRIMARY KEY(that-big-column)
  5. 更新您的代码,以便为新数据执行新行的INSERT

现在一个简单的b树查找加上Join将解决您所有的计划。

TEXT不能与索引一起工作,但VARCHAR在某些限制下可以工作。

最新更新