Как мне ускорить ОБНОВЛЕНИЕ SQL, которое также содержит соединение для 25 миллионов строк

#php #mysql #join #mysqli

#php #mysql #Присоединиться #mysqli

Вопрос:

запрос, который я хотел бы ускорить (или заменить другим процессом):

 UPDATE en_pages, keywords
SET en_pages.keyword = keywords.keyword
WHERE en_pages.keyword_id = keywords.id
  

таблица en_pages имеет правильную структуру, но в ней есть только неуникальные идентификаторы страници_id и keyword_id. я пытаюсь добавить фактические ключевые слова (строки) в эту таблицу, где они соответствуют keyword_ids. в table en_pages есть 25 миллионов строк, которые нуждаются в обновлении.

я добавляю ключевые слова, чтобы к этой таблице можно было запрашивать в режиме реального времени и возвращать ключевые слова (соединение, очевидно, слишком медленное для «реального времени»).

мы применяем этот запрос (и некоторые другие) к подразделам нашего большего набора данных. мы часто делаем это, чтобы создавать пользовательские интерфейсы для определенных подразделов наших данных для разных групп пользователей (извините, если это сбивает с толку).

все это отлично работает, если вы дадите ему час на запуск, но я пытаюсь ускорить это.

есть ли лучший способ сделать это быстрее, используя php и / или mysql?

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

1. Зачем вам обновлять всю таблицу так часто?

2. Что такое механизм обработки таблиц, какое у вас оборудование, какая у вас конфигурация экземпляра MySQL и т.д.?

Ответ №1:

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

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

Ответ №2:

Возможно, я ошибаюсь или неправильно понял вопрос, но…
Не могли бы вы использовать ТРИГГЕРЫ?
Нравится… при обнаружении новой вставки в «en_pages» выполняется ОБНОВЛЕНИЕ после для этой же строки?
(Я не знаю, насколько часты ВСТАВКИ в этой таблице)
Это всего лишь идея.
Как часто «en_pages.ключевое слово»и «en_pages.keyword_id»изменяется после вставки ?!?!?

Ответ №3:

Я не знаю о MySQL, но обычно такого рода вещи выполняются быстрее в SQL Server, если вы обрабатываете ограниченное количество пакетов записей (скажем, 1000) за раз в цикле.

Вы также могли бы рассмотреть предложение where (я не знаю, что MySQL использует для «не равно», поэтому я использовал версию SQL Server):

 WHERE en_pages.keyword <> keywords.keyword 
  

Таким образом, вы обновляете только записи, которые имеют разницу в поле, вы обновляете не все из них.