我有三个应该加入的表,查询看起来像这样:
select distinct a.job
from a
join b on a.job=b.id
join c on c.id =a.path
where c.path like '//depot/a/b/c/d/MARSR_CL286896_297899/%';
此查询将始终超时。但是,如果我将路径比较更改为某些其他条件,则查询只会完美运行,例如:
select distinct a.job
from a
join b on a.job=b.id
join c on c.id =a.path
where c.path like '//depot/a/b/c/d/%';
考虑到路径参数的不同,数字和下划线是否会减慢语句的罪魁祸首?我为'path'字段创建了索引
1 SIMPLE b index PRIMARY job 62 73580 Using index; Using temporary
1 SIMPLE a ref path,job job 8 b.id 153
1 SIMPLE c eq_ref PRIMARY,path PRIMARY 8 a.path 1 Using where
答案 0 :(得分:3)
是。下划线也是一个通配符,它匹配任何(单个)字符,因此这使得查询非常复杂,因为它只能使用第一部分上的索引,直到第一个下划线,并且需要扫描所有匹配在那一部分有一个相对复杂的正则表达式来匹配其余部分,否则它可以做一个简单的'开头'。
您应该将其转义为普通下划线。您可以通过在下划线前面添加\
来逃避它。如果需要,还可以使用\%
来转义这样的百分号。
select distinct a.job
from a
join b on a.job=b.id
join c on c.id =a.path
where c.path like '//depot/a/b/c/d/MARSR\_CL286896\_297899/%';