【问题标题】:Is there a way to optimally index reversed varchars in MySQL有没有办法在 MySQL 中优化索引反向 varchars
【发布时间】:2021-10-14 14:47:15
【问题描述】:

我知道数据库能够以最佳方式将索引用于查询WHERE x like "foo%"
但理论上,如果你将文本反转并将反转的字符串存储在索引中,
那么该索引可用于优化搜索WHERE x like "%foo"

有没有办法在 MySQL 或任何其他数据库中创建这样的反向索引?

【问题讨论】:

  • 请参阅this Q&A 了解一些相关上下文。长话短说,存储字符串的第二个副本(其字符颠倒)可能更容易,并通过该辅助字符串进行后缀搜索。

标签: mysql database database-indexes


【解决方案1】:

是的,在 MySQL 5.7 及更高版本中,您可以创建生成的列并为其编制索引。

例如:

CREATE TABLE phrase (
  word VARCHAR(128),
  reversed_word VARCHAR(128) GENERATED ALWAYS AS (REVERSE(word)) VIRTUAL,
  INDEX worddex (word),
  INDEX reversedex (reversed_word)
)
COLLATE=utf8mb4_general_ci;

然后你可以搜索这样的东西。 Try it.

SET @search_for := 'hello';
SELECT word FROM phrase
WHERE (     word LIKE CONCAT(@search_for, '%')
         OR reversed_word LIKE CONCAT(REVERSE(@search_for), '%')
      );

对于一般搜索功能来说,这可能是一个非常有用的技巧。例如,如果用户知道帐号的最后几位数字,它就会找到它。

【讨论】:

    【解决方案2】:

    理论上(即我没有这样做)第一步是为反转文本创建一个派生列:

    reversed varchar(128) GENERATED ALWAYS AS REVERSE(normal)
    

    然后你会在它上面声明一个索引。我不确定 MySQL 是否允许在派生列上建立索引(我知道 MsSQL 允许),但试试看吧。

    【讨论】:

    • 此列必须建立索引才能有效搜索。所以它可以定义为 VIRTUAL - 这将节省磁盘空间,因为值本身不会存储在表的数据主体中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 2020-12-27
    • 2011-11-05
    相关资源
    最近更新 更多