2013-11-27 67 views
0

所以我們可以說,我們有一個包含多個列的表,我們指數兩列:玩家1玩家2兩欄「或」查詢速度與單柱「雙行」的查詢速度

GAME PLAYER 1 PLAYER 2 ... 
==== ======== ======== 
1  John  Dan 
2  Carl  William 
3  Carl  John 
... 

只對單個列的另一種結構表索引:播放器1(和雙行):

GAME PLAYER 1 PLAYER 2 ... 
==== ======== ======== 
1  John  Dan 
1  Dan   John 
2  Carl  William 
2  William  Carl 
3  Carl  John 
3  John  Carl 
... 

我想查詢John玩過的所有遊戲。哪種表格結構/方法更好?

需要考慮的事情:

  • 這是一個簡化版本,一個必須考慮的表將包含數千行的至少100的,而且會有查詢中若干個連接。
  • 玩家列上會有連接,所以利用「雙列」方法和「OR」/「UNION」也會使一些連接加倍。
  • SINGLE COLUMN方法將需要遊戲列中的「GROUP BY」列。
  • 我們不想耗盡內存,查詢應該保持在內存中運行!
  • TWO COLUMN方法已經變得緩慢了,現在依靠Mysql的內置緩存來保持它以舒適的速度運行。我正在考慮採用單列方法,但不確定後果。
  • 另一種解決方案是有一個附加表玩家遊戲(外鍵)

回答

2

在這種簡單的情況下,通過兩列的索引,無論如何索引都會使表格大小倍增。

如果有2分以上的球員列雖然,第二種方法將有一個行數等於遊戲到電源玩家的列數的數量,而指數的方法就只能數遊戲乘以索引空間的玩家列數。

無論哪種方式,爲了提高性能,最好用ID引用另一個表中的玩家名字來代替名稱。

另外,在我看來可能有一個更簡單的方法。

GAME PLAYER 
==== ======== 
1  John 
1  Dan 
2  Carl 
2  William 
3  Carl 
3  John 

無需複製數據。在這裏,您仍然可以檢索第一場比賽中的所有選手,現在您可以更輕鬆地檢索每位選手所在的比賽。在這裏,您只需要一個索引。但是,這可能會使其他一些查詢變得複雜。

+0

的球員是的...這就是要走的路。將玩家垂直分割成另一張桌子。保持遊戲桌的所有列(較重的表)沒有任何重複的行。 – prograhammer

+0

是的,這些列實際上是玩家ID,但在這個例子中,我認爲看名字更容易。 :-) – prograhammer

2

最好將表格標準化。爲玩家提供一張ID表,並將外鍵即player_id放在遊戲桌上。 如果您在player_ids上設置索引,它會更好地縮放。它也將使用戶的未來變化更容易。

+0

這有點像說單一列的方法更好,但是你試圖將重複數據的大小減少到僅僅是2列的列。所以這就是爲什麼你將它們垂直分開。對? – prograhammer

+0

我想你的意思是,把外鍵「遊戲」放在玩家表中? – prograhammer

+0

我不確定我們說的是同樣的事情,但最佳情況是在遊戲桌 遊戲,player_id1,player_id2 有以下字段,那麼你有另一個表稱爲玩家ID和名稱 所以你可以做一個簡單連接兩個檢索名稱。 但在這種情況下,所有player_ids都可以被索引。 不要在球員桌上放置外鍵。球員表只有關於球員的信息。遊戲將引用那些使用編號爲 –