Я собираю много контента о пользователях. Контент имеет идентификатор владельца, который отличается от идентификаторов, которые я предоставил владельцу. У меня также есть карта ownerId для моих внутренних идентификаторов. Я конфликтую, если мне нужно вставить содержимое с помощью одного или двух запросов.
Схема теста:
CREATE TABLE map (
internalId INT NOT NULL,
ownerId INT NOT NULL,
PRIMARY KEY (internalId),
INDEX (ownerId)
);
Create Table content (
internalId INT NOT NULL,
contentId INT NOT NULL,
PRIMARY KEY (internalId, contentId)
);
INSERT INTO map (internalId, ownerId) VALUES (1,100), (2,1000)
Вариант 1: выбрать соответствующие строки на карте, а затем построитьвставить запрос. Вариант 2: работает следующий запрос (внутренние операторы выбора с UNION ALL генерируются программно):
INSERT IGNORE INTO content (SELECT internalId, contentId FROM (SELECT 101 AS contentId, 100 AS ownerId UNION ALL
SELECT 102 AS contentId, 100 AS ownerId UNION ALL
SELECT 103 AS contentId, 100 AS ownerId UNION ALL
SELECT 1001 AS contentId, 1000 AS ownerId) AS s_q
INNER JOIN map USING (ownerId));
Второй вариант немного быстрее (один запрос и все), но я еще не сделаллюбое стресс-тестирование, поэтому не уверен, как он будет обрабатывать случаи, когда вторая таблица заблокирована из-за вставок или обновлений. Первый вариант легче читать и отлаживать (и обрабатывать взаимоблокировки - вы просто сортируете данные заранее. Я не знаю, есть ли какие-либо гарантии в отношении второго варианта). Есть ли другие аспекты, которые я не заметил?