Какие таблицы будут заблокированы этим запросом? - PullRequest
0 голосов
/ 09 октября 2009

Я перемещаю данные между двумя таблицами, используя запрос ниже. У меня были проблемы с блокировкой таблиц, поэтому я рассматриваю возможность изменения механизмов таблиц с MyISAM на InnoDB. Для каких таблиц мне нужно это сделать? Только таблица, в которую я пишу, или таблица, в которую я пишу, и та, из которой я читаю?

INSERT INTO table1 (
  field1, field2, field2
)
SELECT
  field1, field2,
  (
    SELECT
      temp.field4
    FROM
      table1 AS temp
    WHERE
      temp.id = table2.id
    ORDER BY
      temp.something DESC
    LIMIT
      1
  ) + 1 AS field3
FROM
  table2
WHERE
  NOT EXISTS (
    SELECT
      1
    FROM
      table1 AS temp
    WHERE
      temp.id = table2.id
  )

Ответы [ 2 ]

3 голосов
/ 09 октября 2009

Что заблокировать

Это зависит. Если вы хотите убедиться, что новые данные не могут быть записаны во время выполнения обновления, вам следует заблокировать обе таблицы. Если это просто вопрос записи, заблокируйте только таблицу, в которой выполняется обновление.

Общее неправильное представление

неправильно , что MyISAM не может делать блокировки. MyISAM не поддерживает только блокировку на уровне строк. MyISAM прекрасно умеет блокировать таблицы.

Примите решение на основе следующего списка.

Помощник по принятию решений

Будет ли ваша таблица вставлена, удалена и обновлена ​​намного больше, чем она будет выбрана?
=> InnoDB

Вам нужен полнотекстовый поиск
=> MyISAM

Предпочитаете ли вы / требуете четких ограничений внешнего ключа
=> InnoDB

Проблема с дисковым пространством или оперативной памятью?
=> MyISAM

В сомнении?
=> MyISAM

Победителя нет.

0 голосов
/ 09 октября 2009

таблица 1 должна быть заблокирована. Кто-нибудь может подтвердить?

Я использую только Innodb. я забыл, что делает myisam!

В любом случае, вы должны все переключить на Innodb. В наши дни Innodb так же быстр для чтения.

...