2010-05-28 3 views
2

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

Assign places in the rating (MySQL, PHP)

но моя база данных высокой загрузки.

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

вставки в вершинах (UID) выберите идентификатор пользователя от порядка пользователей по ехр алфавиту;

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

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

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

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

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

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

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

ответ

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

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

0

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

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

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