2017-08-22 98 views
0

tbl_picklist表優化SQL查詢單表連接

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

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 

領料是表,你會得到地址的值,地址2和名稱, 我寫了查詢給我所需的資源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聯接在領料單表, 還有沒有其他的方式,我可以得到結果只與一個連接上選秀表? 我在應用程序中有這種表結構,很多值存儲在picklist表中,它花費很多時間來執行這種查詢。

+0

問題不在於連接,而是您尚未調整查詢。你有沒有申請任何指數? –

+0

@TimBiegeleisen是的,所有表格上都有索引 – sarvesh

+0

哪些列有索引? –

回答

2

當前數據庫結構不正確。 如果您有權利,您應該重建它以優化您的查詢並遵循標準化表單。 例如,picklist_id_addr,picklist_id_addr2及其值應在一個表中,您將在picklist_id_name或user_id上加入。

0

我打算建議在表中添加一系列索引,希望加快查詢速度,直到我意識到更大的問題是您當前的表格設計。最大的罪犯如下表tbl_picklist

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

您存儲約在一個非標準化列用戶的各種信息。相反,我會建議只有兩個表,一個用於用戶信息,另一個用於地址信息。通過主 - 外鍵關係將用戶鏈接到地址。例如:

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 

在這個簡化的模式,你只需要一個單一的查詢來構建整個用戶記錄:

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 

舉個例子,如果你仍然需要優化上述查詢或類似的東西,您只需要擔心單個連接,並且不需要WHERE子句。在這個人爲的例子中,tbl_user.address_id上的索引應該有效。