有没有办法在 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), '%')
);
这对于一般搜索功能来说可能是一个非常有用的技巧。例如,如果用户知道帐号的最后几位数字,这将找到它。
我知道数据库能够最佳地使用索引进行查询 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), '%')
);
这对于一般搜索功能来说可能是一个非常有用的技巧。例如,如果用户知道帐号的最后几位数字,这将找到它。