SQL语句优化:为什么命令运行缓慢?

时间:2012-10-18 19:42:04

标签: mysql sql query-optimization indexing sql-like

我有三个应该加入的表,查询看起来像这样:

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'字段创建了索引

'explain'命令的结果

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

1 个答案:

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