有没有办法在 MySQL 中优化索引反向 varchars

Is there a way to optimally index reversed varchars in MySQL

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

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

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

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

然后您将在其上声明一个索引。我不确定 MySQL 是否允许派生列上的索引(我知道 MsSQL 允许)但试试看。

是的,在 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), '%')
      );

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