2017-08-22 19 views
0

tbl_picklistテーブル最適化SQLクエリは、

id  value 
1  John 
2  Mumbai 
3  San Diego 
4  CA 
5  Jerry 

tbl_userテーブル

id  picklist_id_name email 
1  1     [email protected] 
2  8     [email protected] 

tbl_profileテーブル

id  user_id picklist_id_addr picklist_id_addr2 designation 
1  1   3     5     Dev 
3  2   7     3     QA 

選択リストを使用すると、アドレスの値を取得するテーブルである単一のテーブルに参加しますaddress2と名前、 私は希望のresを与えるクエリを書いたULT

SELECT 
    u.email, 
    p1.value AS username, 
    p2.value AS addr1, 
    p3.value AS addr2 
FROM tbl_user u 
LEFT JOIN tbl_picklist AS p1 
    ON u.picklist_id_name = p1.id 
LEFT JOIN tbl_profile pr 
    ON pr.user_id = u.id 
LEFT JOIN tbl_picklist AS p2 
    ON p2.id = pr.picklist_id_addr 
LEFT JOIN tbl_picklist AS p3 
    ON p3.id = pr.picklist_id_addr2 

結果:

email   username  addr1  addr2 
[email protected] John   Mumbai  San Diego 
[email protected] Jerry   CA   Mumbai 

結果の上に得るために、私は3を書き込むために必要 は1がオンに参加して、私は結果だけを受けることが可能な他の方法があり、ピックリストのテーブルに参加しますピックリストテーブル? 私はアプリケーションでこの種のテーブル構造を持っています。多くの値はpicklistテーブルに格納されています。この種のクエリを実行するには多くの時間がかかります。

+0

問題はジョインではなく、クエリをチューニングしていないことです。まだインデックスを適用しましたか? –

+0

@TimBiegeleisenはいすべてのテーブルにインデックスがあります – sarvesh

+0

インデックスを持つカラムはどれですか?ピックリストテーブルの –

答えて

2

現在のデータベース構造が正しくありません。 権利を持っている場合は、クエリを最適化し、正規化フォームに従うように権利を再構築する必要があります。 たとえば、picklist_id_addr、picklist_id_addr2とその値は、picklist_id_nameまたはuser_idに結合する1つのテーブルに存在する必要があります。

0

大きな問題が現在のテーブルデザインであることがわかるまで、クエリのスピードアップを期待してテーブルに一連のインデックスを追加することをお勧めします。最大の犯罪者は、次の表tbl_picklist次のとおりです。

id  value 
1  John 
2  Mumbai 
3  San Diego 
4  CA 
5  Jerry 

あなたは、単一の非正規化の列にユーザーに関する情報のすべての種類を格納しています。代わりに、私はちょうど2つのテーブルを持っていることをお勧めします.1つはユーザ情報用、もう1つはアドレス情報用です。主な外部キーの関係を介してユーザーをアドレスにリンクします。例:あなたがあれば、一例として

SELECT 
    t1.email, 
    t1.designation, 
    t2.city, 
    t2.state, 
    t2.country 
FROM tbl_user t1 
INNER JOIN tbl_address t2 
    ON t1.address_id = t2.id 

tbl_user 
id | email   | designation | address_id 
1 | [email protected] | dev   | 1 
2 | [email protected] | QA   | 2 

と、この単純化されたスキーマの下

tbl_address 
id | city  | state  | country 
1 | San Diego | CA  | USA 
2 | Mumbai | Bollywood | India 

は、あなただけの全体のユーザー・レコードを構築するために、単一のクエリが必要になります上記のクエリやそれに似たものを最適化する必要がある場合は、単一の結合について心配するだけで済み、 WHERE句は必要ありません。この人工的な例では、 tbl_user.address_idのインデックスがそのトリックを行うべきです。