2011-06-12 39 views
2

我有以下問題。MySQL複製和表鎖

我有一個基於PHP和MySQL的MMORPG遊戲,平均每秒約有600個查詢。 我碰巧遇到了鎖定時間過長並且阻止其他查詢的問題。 (例如,更新查詢需要等待Se​​lect查詢),並且這些必須等待很長時間以便內存已滿。

這些查詢是需要的,我不認爲我可以優化他們了。

對於主從使用複製是一個聰明的想法嗎?掌握寫入和奴隸的選擇? 從設備的寫入語句(來自日誌文件夾)的性能問題與主節點相比是否有問題?它真的會幫助減少桌面鎖問題嗎?

在此先感謝,馬丁


沒關係啊,謝謝回答。 所以,如果我使用InnoDB的這些表。把它們和MyISAM混合起來很聰明嗎?

因爲與MyISAM成爲70MB的測試表與InnoDB成爲200MB。我寧願有一些表與InnoDB有關的問題,其他的只是MyISAM。

在此先感謝,馬丁。

+0

馬丁的最佳利用,歡迎計算器。 – Johan 2011-06-12 20:05:02

+0

我已合併您的兩個未註冊的帳戶。您現在可以編輯您的問題並在個人答案下留下意見。 – 2011-06-14 12:35:25

回答

4

你想複製和東西之前,試試這個:

我假設你的表使用MyISAM數據。
MyISAM鎖定選定的整個表並使更新等待,直到完成選擇。

一些想法想複製

使用InnoDB
切換你的表InnoDB的前考慮的問題。
InnoDB執行行鎖定而不是表鎖定。只有那些更新和選擇的行纔會被鎖定。

考慮使用聚合表
如果你做了很多的聚合查詢,如:

select sum(score) from score where player_id = 1 

考慮制定memory表是這樣的:

CREATE TABLE `test`.`totals` (
    `user_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, 
    `score` INTEGER UNSIGNED NOT NULL, 
    other_fields ..... 
    PRIMARY KEY USING HASH(`user_id`) 
) 
ENGINE = MEMORY; 

將觸發after updateafter insert像這樣:

DELIMITER $$ 

CREATE TRIGGER au_score_each AFTER UPDATE ON score FRO EACH ROW 
BEGIN 
    UPDATE totals SET score = score + (new.score - old.score) 
    WHERE totals.user_id = new.user_id; 
END $$ 

DELIMITER ; 

現在您可以從totals表中獲得您的聚合select查詢,並且您不必再對整個表上的數據庫進行衝擊。

關於主從一些言論
注意,在MySQL的主從是異步的。這意味着,如果您從從機進行選擇並在主機上進行更新,則從機數據將滯後。
這意味着你正在交易你的時間滯後問題的鎖定問題。
在有分數的遊戲中,這可能是一個問題。
此外,你正在複雜的設置。

我不是複製專家,所以我會在這裏停下來,但我想你在探索替代品之前跳入主從。

0

從站更新是單線程的,只需重複在主站上執行的更新即可。所以,儘管你可能會從一個單一的奴隸速度得到一個小小的碰撞,但你實際上需要有幾個奴隸來顯着提高選擇速度。這會顯着增加遊戲的複雜性。

如果你可以升級你的服務器的話,我會建議,第一,也看看MySQL的可調參數,請確保您正在使用內存等

+0

啊好吧,我懷疑我的系統可以處理幾個奴隸。 :S 我現在來看看如何使用InnoDB,如下所示。 (感謝約翰!) 謝謝你們的回答! – Martin 2011-06-16 15:44:01