Разбейте этот запрос на пакеты - PullRequest
0 голосов
/ 30 января 2012

У меня есть таблица MySQL контакты , со структурой следующим образом

+--------------+----------+------+-----+---------+----------------+
| Field        | Type     | Null | Key | Default | Extra          |
+--------------+----------+------+-----+---------+----------------+
| id           | int(11)  | NO   | PRI | NULL    | auto_increment |
| contactee_id | int(11)  | NO   | MUL | 0       |                |
| contacter_id | int(11)  | NO   | MUL | 0       |                |
+--------------+----------+------+-----+---------+----------------+

contactee_id и contacter_id - оба идентификатора, которые вместе определяют отношения между двумя пользователями. Чтобы рассчитать количество отношений, которые есть у пользователя, у меня есть следующий запрос

INSERT INTO followers (id, followers) 
   SELECT contactee_id, 1 
     FROM contacts 
     ON DUPLICATE KEY 
      UPDATE followers = followers + 1

Проблема с этим запросом заключается в том, что он блокирует таблицу contacts слишком долго (более 16 минут). Я хочу сделать это в пакетном режиме, чтобы SQL не блокировал таблицу контактов слишком долго. Я подумал о нескольких способах, но все они должны заблокировать весь стол. Есть ли способ, которым это можно сделать?

Ответы [ 2 ]

1 голос
/ 30 января 2012

Если вы просто хотите, чтобы количество отношений использовалось как количество и группа вместе, как

SELECT contactee_id,count(contacter_id) FROM contacts group by contactee_id;

Это даст вам все contactctee_id и количество contactcter_id для каждого контактера

0 голосов
/ 31 января 2012

Выполните запрос для некоторых записей, а затем сохраните идентификатор последней записи в таблице или файловой системе, запустите следующий запрос с этим идентификатором и обновляйте его каждый цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...