你想複製和東西之前,試試這個:
我假設你的表使用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 update
和after 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的主從是異步的。這意味着,如果您從從機進行選擇並在主機上進行更新,則從機數據將滯後。
這意味着你正在交易你的時間滯後問題的鎖定問題。
在有分數的遊戲中,這可能是一個問題。
此外,你正在複雜的設置。
我不是複製專家,所以我會在這裏停下來,但我想你在探索替代品之前跳入主從。
馬丁的最佳利用,歡迎計算器。 – Johan 2011-06-12 20:05:02
我已合併您的兩個未註冊的帳戶。您現在可以編輯您的問題並在個人答案下留下意見。 – 2011-06-14 12:35:25