[英]Database design and query optimization/general efficiency when joining 6 tables in mySQL
我有6張桌子。 在本示例中將這些簡化。
user_items
ID | user_id | item_name | version
-------------------------------------
1 | 123 | test | 1
data
ID | name | version | info
----------------------------
1 | test | 1 | info
data_emails
ID | name | version | email_id
------------------------
1 | test | 1 | 1
2 | test | 1 | 2
emails
ID | email
-------------------
1 | email@address.com
2 | second@email.com
data_ips
ID | name | version | ip_id
----------------------------
1 | test | 1 | 1
2 | test | 1 | 2
ips
ID | ip
--------
1 | 1.2.3.4
2 | 2.3.4.5
我希望實現以下目標。
用戶(123)具有名稱為“ test”的項目。 這是給定條目所需的基本信息。
“數據”表中有數據,當前版本為1,因此user_items表中的版本也為1。這兩個表通過名稱和版本鏈接在一起。 設置就像這樣,因為用戶可能有一個我們沒有數據的項目,同樣,可能有一個我們有數據但沒有用戶擁有的項目。
對於每個項目,還有0或多個電子郵件和ips關聯。 對於許多項目來說,它們可以是相同的,因此我們不必一遍又一遍地復制實際的電子郵件varchar,我們擁有data_emails和data_ips表,它們分別基於email_id / ip_id和相應的ID列分別鏈接到emails和ips表。
電子郵件和ip通過項目名稱和版本號再次與數據版本相關聯。
我的第一個查詢是這是一個好/好優化的數據庫設置嗎?
我的下一個查詢和主要問題是加入這種復雜的數據結構。
我所擁有的是:
PHP
- get all the user items
- loop through them and get the most recent data entry (if any)
- if there is one get the respective emails
- get the respective ips
根據用戶項的數量,這算作3個查詢還是實質上無限查詢?
我被認為上面的方法效率低下,因此我想將我的設置濃縮為使用一個查詢來獲取相同的數據。
我已經通過以下代碼實現了
SELECT user_items.name,GROUP_CONCAT( emails.email SEPARATOR ',' ) as emails, x.ip
FROM user_items
JOIN data AS data ON (data.name = user_items.name AND data.version = user_items.version)
LEFT JOIN data_emails AS data_emails ON (data_emails.name = user_items.name AND data_emails.version = user_items.version)
LEFT JOIN emails AS emails ON (data_emails.email_id = emails.ID)
LEFT JOIN
(SELECT name,version,GROUP_CONCAT( the_ips.ip SEPARATOR ',' ) as ip FROM data_ips
LEFT JOIN ips as the_ips ON data_ips.ip_id = the_ips.ID )
x ON (x.name = data.name AND x.version = user_items.version)
為了達到這一點,我已經做了很多閱讀工作,並且為到達這里而孜孜不倦地工作。 這可以按我的要求工作-這個問題旨在闡明使用它的好處是什么?
我不得不使用子查詢(我相信嗎?)來獲取ips,因為它以前是乘以結果(我相信基於復雜的聯接)。 我想這個子查詢的工作方式是我的主要困惑。
問題摘要。
-我的數據庫設置是否適合我的使用? 任何改進將不勝感激。 任何有用的資源都可以幫助我擴展知識。
-我的sql中的子查詢實際上如何工作-查詢在做什么?
-我是否正確繼續使用左聯接-我想返回用戶項,如果適用於右,則返回null值。
-我實際上是用2替換可能無限數量的查詢嗎? 這會帶來真正的改變嗎? 以上可以改善嗎?
-考慮到當我更新數據表中某個項目的版本時,我知道必須更新user_items表中的版本,因此我現在還要執行一些更新查詢。 在實踐中對這種設置進行權衡值得嗎?
感謝任何為幫助我更好地理解這一點的人!
根據您的數據布局和目標,該查詢是正確的。 如果您只有少量數據,那不應該是性能問題-隨着數據量的增長,這種情況會迅速改變。 然而,當你AVE大量數據的存在,你應該看到過一次過的所有數據,這意味着結果會以某種方式被過濾極少數的情況下。 確切地如何過濾它們對查詢的結構有巨大的影響。
sql中的子查詢如何實際工作
目前無法正常運作-沒有GROUP BY
在實踐中對這種設置進行權衡值得嗎?
否-這意味着您的架構過於標准化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.