MySQL 不对 INT 字段的无通配符查询使用索引 - 为什么?

Mar*_*tin 3 mysql like

所以我有一个有两个索引的表,一个在 VARCHAR 字段 (url) 上,一个在 INT 字段 (id) 上。如果我使用带有通常 = 的 WHERE 条件对这些字段中的任何一个进行查询,则在这两种情况下都使用索引。但是对于 LIKE 查询,以下使用索引:

SELECT * FROM user WHERE url LIKE 'somevalue';
Run Code Online (Sandbox Code Playgroud)

但这个没有:

SELECT * FROM user WHERE id LIKE 1;
Run Code Online (Sandbox Code Playgroud)

文档中是否有对此的解释,或者有没有人知道为什么会这样?

jka*_*lik 7

回答这个问题:http : //sqlfiddle.com/#!9/1be04/2

LIKE对字符串的作品,因此它具有铸id为一个字符串-铸造是一种类型的一个函数调用(表达式),所以不能使用索引。

我无法在 MySQL 手册中找到该特定信息,因为它是一个称为sargability的通用概念(文章列出LIKE为 sargable,但这仅适用于字符串列/索引和前缀匹配,而不适用于一般情况)。

关于什么是和不可以 sargable 的另一个答案:https ://stackoverflow.com/a/799616/1786423

正如ypercube在评论中指出的那样 -执行查询时1也将转换为'1'。它只执行一次,而不是每一行,因为值是恒定的。它不应该更改此查询的计划,但在某些情况下它也会伤害您 -col IN (1,'2')无论为col.