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