【问题标题】:Find a row in the table for string by the longest common tail (the right part) of the substring通过子字符串的最长公共尾部(右侧部分)在表中查找字符串的一行
【发布时间】:2017-01-24 06:42:49
【问题描述】:

有一个简化的表mytable,其列('id', 'mycolumn') 分别为intvarchar(255)

mycolumn 中为当前字符串找到具有最长公共右侧部分(最长尾)的行的最快方法是什么?桌子很大。

例如,对于字符串"aaabbbkr84" 我们会通过最长的尾巴“bkr84”找到2 - "wergerbkr84"

1 - "gbkyugbk9"
2 -  "wergerbkr84"
3 - "gbkyugbk4".

为了提高性能,我的想法是创建另一个包含还原字符串的列。但是我不确定它是否有帮助,也没有更好的方法。这样我会查找(直到我得到 0 个结果以返回上一个结果)来查找

SELECT id, mycolumn FROM mytable
where reverted like '4%';
SELECT id, mycolumn FROM mytable
where reverted like '48%';
SELECT id, mycolumn FROM mytable
where reverted like '48r%';
SELECT id, mycolumn FROM mytable
where reverted like '48rk%';
SELECT id, mycolumn FROM mytable
where reverted like '48rkb%'; ' <-- looking for this one
SELECT id, mycolumn FROM mytable
where reverted like '48rkbb%'; ' 0 results.

找到0个结果,后退一步:48rkb。这意味着2 - "wergerbkr84" 就是答案。

1 查询以通过最长尾查找一行会更好(如您所见,我在上面有一个查询循环)。 但是,性能是#1。

非常感谢。

【问题讨论】:

    标签: mysql sql string substring sql-like


    【解决方案1】:

    这可能有点奇怪,但听起来你有一个奇怪的问题。

    您是否尝试过在 SQL 中存储正确的树结构并对其进行查找?例如,您可以创建一个trie/prefix tree,其中数据库中所有字符串中每个可能的字符选择都有一条边(以相反的字符串顺序进行)。

    请参见上图,以获取问题中三个字符串(标记为 1、2、3)的部分填充的 trie 示例。当您从根遍历时,节点存储对从边缘标签编码的所有字符串的引用。对于搜索字符串“48”,沿着标记为“4”和“8”的边,您将获得对标记为 2 ("wergerbkr84") 的字符串的引用。搜索继续进行,直到没有边缘被搜索字符串中的下一个字符标记,此时具有最长匹配尾的字符串存储在当前节点中。搜索时间为O(n),其中n是搜索字符串的长度。

    请参阅以下内容:How to represent a data tree in SQL? 请注意,您必须考虑存储边缘标签,这在大多数树结构中是不需要的。

    另请注意,根据您的存储要求,有可能值得研究的压缩/空间优化版本的尝试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-14
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      相关资源
      最近更新 更多