MySQL: наиболее эффективный метод обновления записей в большой базе данных?

#php #mysql #performance #optimization

#php #mysql #Производительность #оптимизация

Вопрос:

Допустим, у меня есть таблица с 1000 записями, и я хочу обновить только одну запись. Ускорит ли запрос, если я укажу больше предложений ‘WHERE’, чтобы сузить поиск до меньшего количества возможных совпадающих записей, или быстрее просто указать одно предложение WHERE (например. Идентификатор записи)?

ПРИМЕР:

 UPDATE table
SET record_name = 'new name'
WHERE record_ID = 'x'
LIMIT 1
  

или

 UPDATE table
SET record_name = 'new name'
WHERE record_ID = 'foo'
AND record_city = 'bah'
LIMIT 1
  

Ответ №1:

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

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

1. Значит, указание большего количества идентифицирующих элементов не ускоряет запрос?

2. Это может помочь, если вы не обновляете что-либо по индексированному столбцу — чем более подробным является ваше предложение where, тем меньше записей нужно сканировать и обновлять. Обновление по первичному ключу было бы самым быстрым способом обновить одну запись.

Ответ №2:

если record_ID является первичным ключом, первое решение является самым быстрым. Я думаю, что нет необходимости указывать «LIMIT 1», потому что это подразумевается в первичном ключе

Ответ №3:

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

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

Обратите внимание также, что использование LIMIT без ORDER BY приведет к прерыванию сериализации для репликации и восстановлению двоичных журналов для восстановления на момент времени в режиме ИНСТРУКЦИИ.

В этом случае лучше указать в WHERE все, что необходимо, и не вводить ОГРАНИЧЕНИЕ.

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

1. Можете ли вы показать код? Что там было насчет сериализации (вроде как потерял меня). Я предположил, что ограничение ускорит запросы, поскольку после обнаружения запрос остановится и больше не будет искать совпадения.