1

我有三个应该连接的表,查询如下所示:

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/%';

考虑到路径参数的不同,数字和下划线会不会是减慢语句的罪魁祸首?我为“路径”字段创建了索引

“解释”命令的结果

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
4

1 回答 1

3

是的。下划线也是通配符,它​​匹配任何(单个)字符,因此这使得查询变得相当复杂,因为它只能使用第一部分的索引,直到第一个下划线,并且需要扫描所有匹配项在那部分用一个相对复杂的正则表达式来匹配其余部分,否则它可以做一个简单的“开始于”。

您应该将其转义以将其视为正常的下划线。\您可以通过在下划线前添加 a 来转义它。如果需要,您也可以像这样转义百分号\%

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/%';
于 2012-10-18T19:44:21.490 回答