2012-08-13 83 views
2

我有一張存儲遊戲高分的表格。這個遊戲有很多級別,其中分數然後通過分數DESC(這是一個索引)進行排序,其中級別是級別ID。在這個級別ID列上進行分區會創建與創建許多獨立級別表(每個級別ID一個)相同的結果嗎?我需要這個以某種方式分離出關卡數據,因爲我預計有數百萬條記錄。我聽說分區可以加快這個過程,同時讓我的表格正常化。另外,我的遊戲中有一個未知數量的級別(級別可能隨時添加或刪除)。我可以指定在這個級別ID列上進行分區,並且在新的(不同級別ID)添加到高級表時,可以創建新的分區automaticaly嗎?我可能從10個單獨的關卡開始,但最終得到50個,但是我的所有數據仍然保存在一張表中,但是有多個分區?我是否需要對級別ID進行索引才能使其工作?MySQL分區高分表

在此先感謝您的建議!

回答

1

在單個列上創建索引是好的,但根據您提供的信息創建包含兩列的索引將是更好的解決方案。我會運行一個

alter table highscores add index(columnScore, columnLevel); 

這會使性能更好。從數據庫的角度來看,無論您尋找什麼高分,數據庫都會知道在哪裏搜索它們。

關於這一點,如果可以的話,(你正在使用mysami表),你也可以運行一個:

alter table order by columnScore, columnLevel; 

這將隨後組中的所有數據一起,這樣即使數據庫知道在哪裏每一位都可以找到附近所有屬於彼此的記錄 - 這意味着更少的硬盤驅動器工作 - 因此可以更快地獲得結果。

那第二次操作也會造成巨大的差異。我的個人電腦在工作(九十年代最糟糕的老機器)有一個數據庫,裏面有數百萬條記錄 - 沒有什麼大的,大約2.5GB的數據包括索引 - 而且性能在拖拽,但是訂購這些索引的數據將查詢時間從每個查詢大約1.5分鐘提高到大約8秒。這只是因爲硬盤速度能夠到達包含數據的所有扇區。

+0

你好,我不能做一個「改變表」,因爲我正在使用只讀副本,這將爲讀取副本創建大量更改以跟上。 – Schodemeiss 2012-08-13 08:26:13

+0

不是,換個表(至少是第一個表)可能會磨掉一段時間,但它會是一次性的操作。之後,他們應該沒事。第二個(假設你正在運行一個雲)對你來說可能並不重要 - 儘管如果他們使用的RAID陣列性能較差,它可能會有所幫助...... – Fluffeh 2012-08-13 08:36:46

+0

好的,這很有趣!做一個「改變表」和排序這樣的分數也意味着我的索引也必須重新創建?說,我有一個關於「scoreID」和「分數」的索引? – Schodemeiss 2012-08-13 08:57:23

0

如果你打算存儲不同用戶的數據,那麼有兩張表 - 一個關於不同級別的所有信息,另一個關於每個用戶的一行以及XML/json中的分數?