Прежде чем думать о репликации и прочем, попробуйте следующее:
Я предполагаю, что ваши таблицы используют 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 ;
Теперь вы можете получать совокупные select
запросы из таблицы totals
, и вам больше не нужно увеличивать базу данных на полных таблицах.
Несколько замечаний о главном-подчиненном
Обратите внимание, что ведущий ведомый в MySQL является асинхронным. Это означает, что если вы выберете ведомого и обновите на главном, ваши ведомые данные будут отставать.
Это означает, что вы заменяете свои проблемы блокировки на проблемы с задержкой во времени.
В игре с оценками это может быть проблемой.
Кроме того, вы усложняете настройку.
Я не эксперт по репликации, поэтому я остановлюсь здесь, но я думаю, что вы прыгаете в master-slave, прежде чем исследовать альтернативы.