在InnoDB表中,有一个varchar列,我希望只对最后10个字符进行搜索查询。当我在整个列上创建索引并执行搜索where right(mycol, 10) = p_search时,不使用该索引。是否有一种方法可以创建索引,以便对最后10个字符的搜索查询使用该索引?据我所知,MySQL在左侧提供创建索引,但在这种情况下不起作用。
发布于 2017-06-10 21:40:53
如果使用的是MySQL 5.7,则可以添加一个生成的列,其中包含列的右侧,并对其进行索引。
ALTER TABLE yourTable
ADD newCol CHAR(10) AS (RIGHT(oldCol, 10)) STORED,
ADD INDEX (newCol);请注意,您不必更改查询以使用虚拟列。文档说:
如果生成的列被索引,优化器将识别与列定义匹配的查询表达式,并在查询执行期间酌情使用来自该列的索引,即使查询不按名称直接引用该列。
因此,如果编写WHERE RIGHT(oldCol, 10) = "abcdefghij",优化器将其视为WHERE newCol = "abcdefghij"并使用索引。
如果使用的是旧版本,则可以将其添加为真正的列,并在列发生更改时使用触发器更新它(这本质上是STORED虚拟列自动进行的)。但在这种情况下,您需要更改查询以测试新列。
https://stackoverflow.com/questions/44478184
复制相似问题