REPLACE INTO

D
На сайте с 28.06.2008
Offline
1108
592

Как говорится век учись - открыл для себя REPLACE INTO, раньше всегда когда нужно было что-то записать в базу использовал INSERT INTO.

Я правильно понимаю, если я в базу пишу новые значения и у меня первичный ключ ID, то можно смело использовать  REPLACE вместо  INSERT и это будет даже быстрее?

W1
На сайте с 22.01.2021
Offline
306
#1
Можно. Но с чего бы это было быстрее? REPLACE используют в тех случаях, когда есть вероятность попасть на уже существующий ключ. Если такой ситуации заведомо не будет, то оно нинафиг не сдалось.
Мой форум - https://webinfo.guru –Там я всегда на связи
D
На сайте с 28.06.2008
Offline
1108
#2
W1
На сайте с 22.01.2021
Offline
306
#3

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

REPLACE  makes sense only if a table has a  PRIMARY KEY  or  UNIQUE  index. Otherwise, it becomes equivalent to  INSERT , because there is no index to be used to determine whether a new row duplicates another.

Сам производительность не проверял, ни к чему было. Но что-то мне подсказывает, что причин для лучшей производительности при замене не должно быть. И там, и там сервер должен определить, какой текущий номер автоинкремента и существует ли уникальный ключ с требуемым идентификатором. Только в случае INSERT выдаётся ошибка, а в случае REPLACE делается удаление и вставка.

W1
На сайте с 22.01.2021
Offline
306
#4
Вот кстати дальше прочитал на той же страничке про алгоритм:

MySQL uses the following algorithm for REPLACE  (and LOAD DATA ... REPLACE ):

  1. Try to insert the new row into the table

  2. While the insertion fails because a duplicate-key error occurs for a primary key or unique index:

    1. Delete from the table the conflicting row that has the duplicate key value

    2. Try again to insert the new row into the table

То есть первым делом сервер пытается тупо вставить строку в таблицу. И в случае неудачи уже удаляет и снова вставляет. А если удачно прошёл первый этап - то всё, закончили. Одним словом, полный эквивалент INSERT.

Лично я предпочитаю использовать INSERT  и REPLACE соответственно их назначению, то есть там, где дубли не предполагаются, использовать  INSERT - исключительно по той причине, что не нужно морочить голову последующим читателям кода вопросом: "А что там может быть такого, что может понадобиться замена?". То есть в целях прозрачности кодирования.

C
На сайте с 04.02.2005
Offline
291
#5
ой, еще можно открыть для себя
https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html
LEOnidUKG
На сайте с 25.11.2006
Offline
1762
#6

Всё нужно использовать по назначению.

Для обычной вставки нужен INTO. ВСЕГДА!!!

REPLACE используется в основном там где идёт многопоточная вставка, например, парсеры собирают данные в одну кучу и потом идёт разбор всего этого и чтобы не делать дополнительных проверок в алгоритме всё сбрасывается на плечи MySQL и он там уже сама решает или заменить данные или вставить новые.

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

Все инструменты созданы под свои нужды.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
LEOnidUKG
На сайте с 25.11.2006
Offline
1762
#7
Chukcha #:
ой, еще можно открыть для себя
https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html

А есть ещё:  INSERT IGNORE

Много чего есть.

LEOnidUKG
На сайте с 25.11.2006
Offline
1762
#8
Dram :

 REPLACE вместо  INSERT и это будет даже быстрее?

АГа... МАГИЯЯЯЯЯЯЯ 


LEOnidUKG
На сайте с 25.11.2006
Offline
1762
#9

Ты определись ты с Mysql работаешь или с YDB?

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий