簡體   English   中英

使用主鍵進行查詢優化

[英]Query optimization using primary key

我有一個包含兩個表的數據庫:一個保留每個用戶的信息,另一個保留每個用戶當前正在玩的游戲的信息。 每個用戶行和每個游戲行都有唯一的主要ID,因此每當我要獲取特定行時,都可以通過查詢唯一ID來獲取它(據我所知,這是更快的,因為可以通過索引而不是索引來獲取該行遍歷表格的每一行)

現在,游戲表中的每個條目都包含有關用戶的信息,因此,如果我想為特定用戶獲取每個游戲,我將可以。 但是,這就是我目前為用戶獲取每個游戲的方式:

我為每個用':'分隔的用戶保存每個游戲的唯一ID。 然后,我拆分此列表,並分別查詢每個游戲ID。 所以我的問題是,使用每個游戲的主ID進行單獨的查詢是否更有效,還是僅執行“ SELECT * FROM games WHERE userID ='theUsersID'”更好。

換一種說法,從長遠來看,對幾個唯一的ID進行多個查詢,還是一次查詢但必須查看數據庫中的每個條目,這樣做更好嗎? 為了大致了解我的數據庫負載,我通常有10,000個用戶,每個用戶一次擁有大約10個游戲。 因此,比較是使用每個查詢的主鍵進行100,000個查詢,或者使用10,000個查詢,但必須對每個查詢遍歷所有行。

謝謝。

MySQL甚至不會忽略您所考慮的低音量。 允許將來的靈活性。 您的“每位用戶的游戲數”表應為UniqueID,UserID,GameID-以及您可能希望針對每位用戶,每項游戲組合跟蹤的其他信息……這是最常見的,上次為特定游戲玩過的時間等我絕不建議通過任何分隔符來串聯獨特的游戲。 這樣,您可以輕松查詢...

誰喜歡通過查詢游戲ID來喜歡某個特定的游戲,或者普通人喜歡玩多少種不同的游戲?用戶中最常用的游戲是什么?

簡單地在表上具有多個索引。一個在主ID(必填)上,一個通過用戶ID和游戲ID(用於用戶首先對游戲進行優化搜索),另一個通過游戲ID和用戶ID(用於搜索特定游戲) )

當您執行“ SELECT * FROM games where WHERE userID ='theUsersID'”時,數據庫引擎實際上不必查找所有數據庫條目。

如果這是常見查詢,則userID列應具有索引,以便可以快速處理對位置的限制。 從長遠來看,只對每個游戲執行一次查詢,然后對每個游戲進行一次查詢,效率會更高。

因此,據我所知,用戶與游戲之間存在多對多的關系。

每個用戶玩很多游戲每個游戲都有很多用戶。

並且您當前正在將每個用戶玩的游戲存儲在users表中

User ID | Games ID's
1 | 45:23:12
2 | 23:66:11

因此您的表未規范化。 甚至沒有1NF。 考慮規范化您的數據。

一張游戲桌,您已經有了。 用戶一張桌子,您也有這張桌子。 一個膠水表,users_games,具有:

ID | userID | GameID
1 | 1 | 45
2 | 1 | 23
3 | 1 | 12
4 | 2 | 23
5 | 2 | 66
6 | 2 | 11

因此,要檢索有關一個用戶的數據,您將使用聯接

Select GameID from users u join users_games ug on u.id=ug.userID where u.id='2';

並且您可以擴展users_games表中的列。

該模型將具有可伸縮性和可管理性。

希望有道理:)

選擇*從游戲中,其中userID = userID將是最佳模型;

如果您需要使用LEFT JOIN將多個游戲連接到一個用戶,那么您將可以通過一個查詢來完成

在游戲表中有foloving列ID | 用戶名| 在id上放置Unique AI和userID可以是簡單索引

據我了解,您的表是這樣構建的:

Table_User:
UserId (PK);
UserInformation;
UserInformation2; 
...

Table_Games:
GameId (PK);
UserId (PK);
GameInformation;
...

因此,進行左加入:

SELECT * 
FROM Table_Games G 
LEFT JOIN Table_User U on (U.UserId = G.UserId) 
WHERE UserId = 'MyUserId'

可能會幫助您。

在這里,您還可以通過唯一的名稱或名稱來選擇用戶。 否則基於Table_User!

問候!

通常最好是執行一個大查詢而不是許多小查詢,因為:

  • 它只能在一次數據庫往返中執行,而不是多次。 當數據庫往返需要通過網絡時,這尤其重要。
  • 允許數據庫引擎使用比您在代碼中模擬的簡單NESTED LOOPS更高級的查詢計划(Oracle等“大型”數據庫也能夠執行MERGE或HASH JOIN,不確定MySQL)。

在兩個表上執行JOIN應該可以解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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