簡體   English   中英

在MySQL中聯接6個表時的數據庫設計和查詢優化/一般效率

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM