我有一种情况,我们在数据库中存储长唯一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
谓词的索引来匹配在模式前面使用通配符的子字符串。
MySQL 8.0.17支持一种新的JSON数组索引,称为多值索引。如果您可以将所有令牌存储为JSON数组,即使是作为单个令牌接收的令牌,也可以使用这种类型的索引。但这也需要编写一些代码将id的单数形式转换为JSON数组。
底线是,如果您必须支持任何和所有格式,则没有单一的解决方案来索引文本。你要么不得不忍受未经优化的搜索,要么你需要找到一种方法来修改数据,以便你可以索引它。
- 新建表2列:一个
VARCHAR(200) CHARSET ascii COLLATION ascii_bin
(BASE64需要区分大小写) - 在你的主表中,一个表可以有多个行。
- 使用一些简单的解析来查找表中的字符串(或字符串),并将它们添加到这个新表中。
PRIMARY KEY(that-big-column)
- 更新您的代码,以便为新数据执行新行的
INSERT
。
现在一个简单的b树查找加上Join将解决您所有的计划。
TEXT
不能与索引一起工作,但VARCHAR
在某些限制下可以工作。