2016-12-20 14 views
0

私はディレクトリ構造のようにsmthを定義するテーブルFOLDERSを持っています。これには、ID、PARENT_ID、およびLINK_IDという列が含まれています。OR条件付きのMySQL結合テーブル

遅いクエリで問題が発生しているアプリケーションを変更することはできません。

このアプリケーションには、PARENT_IDがID またはLINK_IDの両方を参照できるロジックがあります。

また、私は私が見つけたこと、クエリを変更することはできません全体私たちのETLプロセスを遅くする:

SELECT folders.ID AS OrigFolderID, parentfolder.ID, parentfolder.Name 
FROM folders 
      LEFT JOIN folders AS parentfolder ON folders.ParentID=parentfolder.ID OR folders.ParentID=parentfolder.LinkID 
WHERE folders.ID IN    (112450385,188823933,211307470,211403833,211545367,212449523,212539966) 

私たちは、削除またはインデックスの追加、しかし、データベースを変更することができます。

このクエリを高速化する可能性はありますか?

"parentfolder"のインデックスが動作していないようです(LinkID、ParentId、およびプライマリキーのIDにインデックスがあり、テーブルが完全にスキャンされています) 。

+0

クエリーの前にクエリーを編集して結果を編集します。また、テーブル定義を表示 – Mihai

+1

クエリーを変更できない場合は、ほとんどオプションがありません。クエリから 'OR'を取り出すことができるなら、あなたが手がけたすべてのインデックスがあります。 'OR'sは、MySQLでのインデックスの使用をほとんど排除します。 – Uueerdo

答えて

1

私はIDLinkIDが各インデックス化されていると仮定し

ORキラーであるあなたクエリを変更する方法を見つけるてはならない。。。。など、一切のチューニングパフォーマンス上の問題を解決することができます

LEFTは疑いがあります - 親がない場合はNULLが必要ですか?

は、のいずれかの側の2つの選択肢のうち、UNION DISTINCTになります。

+0

こんにちは、リック!答えをありがとう。私は、クエリを変更することはできませんので、問題を解決する方法はありません。このアプリケーションにMS SQL Serverを使用しようとするか、テーブルを小さくしようとします。ありがとう! –