Место рейтинга - PullRequest
       32

Место рейтинга

2 голосов
/ 28 мая 2010

Я пытаюсь сгенерировать таблицу рейтинговых мест, используя следующую квитанцию ​​

Назначение мест в рейтинге (MySQL, PHP)

но моя база данных сильно загружена.

Я попытался не создавать таблицу, а использовать MEMORY TABLE и обновить ее, используя следующий запрос SQL

вставить в tops (uid) выбрать uid из порядка пользователей по exp desc;

но получил следующую ошибку MySQL

Обнаружен тупик при попытке получить блокировку; попробуйте перезапустить транзакцию

потому что слишком много запросов, пока не выполняется SQL select.

Как решить эту проблему?

P.S. CREATE TABLE tops при SELECT работает почти нормально, за исключением высокой нагрузки на сервер ... до средней нагрузки: 50, если вершины не являются таблицами памяти.

У моих пользователей таблицы около 4,5 миллионов строк.

Спасибо за любые советы.

Ответы [ 2 ]

0 голосов
/ 22 июля 2011

Вы можете использовать InnoDB вместо таблицы памяти, если вам нужен высокий параллелизм.

InnoDB поддерживает блокировку на уровне строк и MVCC (Multiversion Concurrency Control), что, я думаю, то, что вам нужно. Memory и MyISAM будут быстрее (при вставке / обновлении), но если вы часто сталкиваетесь с блокировками, тогда InnoDB будет правильным решением.

Если InnoDB создает проблемы с производительностью при высокой нагрузке, скорее всего, это связано с фрагментированными индексами и слишком большим количеством разбиений страниц. Вы можете решить эту проблему, периодически делая ALTER TABLE innodb_tbl_name ENGINE=InnoDB, который перестраивает таблицу и, следовательно, индексирует для оптимальной производительности.

0 голосов
/ 22 июля 2011
  1. Следует отметить, что таблицы MEMORY обрабатывают блокировку таблиц подобно MYISAM (обе они выполняют полную блокировку таблиц).

4,5 миллиона строк - это много вставок для выбора. Я думаю, что хорошим подходом было бы написать скрипт, который собирает данные таблицы пользователей в виде фрагментов и выполняет пакетную вставку.

...