0

タイムアウトしないように、高度に最適化されたソリューションを必要とする SQL クエリを作成しています。しかし、次の SQL クエリを継続的に最適化する方法がわかりません。

select distinct j.job,f.path,p.path 
from fixes f, jobs j, paths p where f.job=j.id and p.id =f.path 
and (p.path like '//Tools/Web/%' or p.path = '//Tools/Web');

次のフィールド (基本的にすべて) にインデックスを作成しました。

  • ジョブID
  • ジョブ.ジョブ
  • パス.パス
  • パス.id
  • 修正.ジョブ
  • fix.path

「fixes」、「jobs」、「paths」テーブルのそれぞれに最大 50,000 行あり、現在のタイムアウトは 6 分です

「explain」コマンドは次の情報を表示します。解読してみてください

1   SIMPLE  j   index   PRIMARY         job     62   (null)    73226    Using index; Using temporary
1   SIMPLE  f   ref     path,job        job     8    j.id      825  
1   SIMPLE  p   eq_ref  PRIMARY,path    PRIMARY 8    f.path    1        Using where

「パス」テーブルのテーブル作成ステートメント:

CREATE TABLE `paths` (
   `id` bigint(20) NOT NULL AUTO_INCREMENT,
   `path` varchar(250) NOT NULL,
   PRIMARY KEY (`id`),
   UNIQUE KEY `path` (`path`),
 ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
4

3 に答える 3

2

これで同じ結果が得られるのではないでしょうか?

select distinct j.job,f.path,p.path  
from fixes f
join  jobs j on  f.job=j.id 
join  paths p  on p.id =f.path  
where p.path like '//Tools/Web%' 

OR は、ほとんどの場合、コストのかかる機能です。

ユニオン クエリを試すこともできます。多くの場合、OR よりも高速です。

select  j.job,f.path,p.path  
from fixes f
join  jobs j on  f.job=j.id 
join  paths p  on p.id =f.path  
where p.path like '//Tools/Web/%' 
union 
select  j.job,f.path,p.path  
from fixes f
join  jobs j on  f.job=j.id 
join  paths p  on p.id =f.path  
where  p.path = '//Tools/Web'); 
于 2012-10-12T17:03:04.903 に答える
2

DISTINCT が必要ですか? おそらく、データセットでそれを必要としない可能性があります。それなしでクエリを書き直し、path.p 条件で WHERE 条件を開始することができます。他の 2 つのテーブルを結合することもできます。

例えば

    select j.job,f.fix,p.path 
    from paths.p
    join fixes f on (f.path = p.id)
    join jobs j on (f.job = j.id)
    where (p.path like '//Tools/Web/%' or p.path = '//Tools/Web')

     group by job, fix, path

個別が必要な場合は、GROUP BY が役立つ場合があります。また、元のクエリには「パス」と呼ばれる 2 つの列があります。

于 2012-10-12T17:06:17.217 に答える
1

これらのインデックスがクエリで使用Explain your sql queryされているかどうかを確認するために使用します

クエリに 6 分という時間がかかるため、インデックスが間違っていると確信しています。

于 2012-10-12T16:47:37.233 に答える