仅在MySQL的右侧部分索引

时间:2017-06-10 21:20:10

标签: mysql indexing

在InnoDB表中,有一个varchar列,我想只对最后10个字符进行搜索查询。当我在整个列上创建索引并执行搜索where right(mycol, 10) = p_search时,不使用索引。有没有办法创建索引,以便最后10个字符的搜索查询使用索引?我知道MySQL在左侧部分提供了创建索引,但在这种情况下不起作用。

1 个答案:

答案 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虚拟列自动执行的操作) 。但在这种情况下,您需要更改查询以测试新列。