1

結合されるはずの 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/%';

このクエリは常にタイムアウトします。ただし、パスの比較を他の条件に変更すると、クエリは完全に実行されます。たとえば、次のようになります。

 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 に答える