Статус ОБНОВЛЕНИЯ MySQL из другой таблицы

#mysql #sql #sql-update

#mysql #sql #sql-обновление

Вопрос:

У меня есть таблица статей с довольно небольшим объемом данных (25 тыс. строк). В таблице есть опубликованный столбец (boolean), который необходимо обновлять в зависимости от состояния данных из внешнего канала.

Сначала я установил published = 0 для всех статей. Затем я загружаю данные фида во временную таблицу с простым идентификатором статьи и published = 1. Я хочу вернуть опубликованному статусу значение 1 для всех статей, у которых есть идентификатор во временной таблице (временная таблица содержит только опубликованные статьи — по умолчанию, если их нет в ленте, они должны быть неопубликованными).

Прямо сейчас я использую это:

 UPDATE articles a
LEFT JOIN data_temp b
ON a.id = b.id
SET a.published = 1
WHERE b.id IS NOT null
  

Это работает, но это действительно медленно (примерно на 200 секунд медленнее на моем сервере разработки). Похоже, должен быть способ сделать это действительно быстро. Спасибо за помощь.

Комментарии:

1. Почему вы используете ЛЕВОЕ СОЕДИНЕНИЕ? Кроме того, содержит ли временная таблица какую-либо с published = 0?

2. Этот запрос не совсем соответствует описанию проблемы.

3. @Jai— во временной таблице будут отображаться только опубликованные статьи. @steve — не уверен, что ты имеешь в виду.

Ответ №1:

Есть ли у вас индексы по двум столбцам идентификаторов двух таблиц? Если нет, это потенциально может значительно ускорить объединение.

Комментарии:

1. вау — ты по уши влюблен в actionshrimp. Наверное, я должен был это учесть, но при добавлении индекса он стал почти мгновенным. Спасибо за помощь!

2. @cez — Я сделаю это, как только истекут десять минут и система позволит мне!

Ответ №2:

 UPDATE articles SET published = 1 WHERE id IN (SELECT id FROM data_temp)
  

Поскольку он кэширует результат подзапроса, это должно быть довольно быстро…