在 InnoDB 表中,有一varchar列,我只想对最后 10 个字符进行搜索查询。当我在整个列上创建索引并进行搜索时 where right(mycol, 10) = p_search,不使用该索引。有没有办法创建索引,以便对最后 10 个字符的搜索查询使用该索引?我知道 MySQL 提供了在左侧部分创建索引的功能,但这在这种情况下不起作用。
如果您使用的是 MySQL 5.7,您可以添加一个生成的列,其中包含该列的右侧并为其建立索引。
ALTER TABLE yourTable
ADD newCol CHAR(10) AS (RIGHT(oldCol, 10)) STORED,
ADD INDEX (newCol);
Run Code Online (Sandbox Code Playgroud)
请注意,您不必更改查询即可使用虚拟列。文档说:
如果生成的列已建立索引,则优化器会识别与列定义匹配的查询表达式,并在查询执行期间根据需要使用该列中的索引,即使查询不直接按名称引用该列。
因此,如果您编写WHERE RIGHT(oldCol, 10) = "abcdefghij",优化器会将其视为WHERE newCol = "abcdefghij"并使用索引。
如果您使用的是旧版本,则可以将其添加为真实列,并在列更改时使用触发器来更新它(这本质上是虚拟STORED列自动执行的操作)。但在这种情况下,您需要更改查询来测试新列。