所以我有一个有两个索引的表,一个在 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)
文档中是否有对此的解释,或者有没有人知道为什么会这样?
回答这个问题: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
.
归档时间: |
|
查看次数: |
959 次 |
最近记录: |