Быстрее ли вставить повторяющееся значение в уникальный столбец или сначала проверить, уже ли оно вставлено

У меня есть уникальный столбец в моей таблице, который представляет собой длинную строку id, созданную приложением.

Теперь быстрее, если я просто использую INSERT, и если этот id уже существует в таблице, ничего не произойдет, или лучше сначала проверить с помощью SELECT, что id уже находится в таблице, и если это не так, я вставляю Это?

Или, что еще лучше, сделайте auto_increment и пусть MySQL сделает это за вас.

verhie 09.03.2018 14:38

Слишком много возможных переменных для общего ответа. Вы должны протестировать производительность со своей схемой и данными.

Richard 09.03.2018 14:39

... не говоря уже о неясных, слишком общих и, возможно, основанных на мнениях.

Funk Forty Niner 09.03.2018 14:40

Почему, черт возьми, кто-то проголосовал за это. Этот вопрос не соответствует правилам сайта

IsThisJavascript 09.03.2018 14:41

@IsThisJavascript Я и сам думал об этом.

Funk Forty Niner 09.03.2018 14:42

Контекст того, что вы делаете, также может быть решающим фактором. Если идентификатор уже существует, вы хотите узнать информацию, которая уже была вставлена? Если это так, то вы, вероятно, сначала захотите SELECT. Если идентификатор уже существует, хотите ли вы записать UPDATE в существующую запись? Если да, то вам, вероятно, захочется INSERT INTO ... ON DUPLICATE KEY UPDATE. Здесь вам не хватает много полезной информации.

Patrick Q 09.03.2018 14:46

@verhie У меня уже есть столбец auto_increment. Это еще один идентификатор, сгенерированный приложением, это длинная строка.

user3833850 09.03.2018 14:48

Это недалеко от ответа @PatrickQ. У меня была такая же мысль раньше, и я собирался забить ее чем-то похожим, но это должно было оспариваться, поэтому я просто проголосовал за то, чтобы быть слишком широким.

Funk Forty Niner 09.03.2018 14:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
8
47
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

При прочих равных, я ожидаю, что простая вставка будет быстрее, если строка не существует, поскольку в противном случае вы выполняете два оператора - проверку и вставку. Обратной стороной является то, что если строка действительно существует, ваш вызов выдаст ошибку, которую вам затем придется обработать.

В зависимости от желаемого поведения у вас есть несколько вариантов:

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

INSERT IGNORE игнорирует любые повторяющиеся ключевые ошибки; он также проигнорирует любые другие ошибки, поэтому я бы не советовал этого вообще.

REPLACE выполняет базовую команду стиля UPSERT: вставляет, если дубликаты не обнаружены, обновляет, если дубликаты не обнаружены. «Стоимость» заключается в том, что вы всегда записываете полную запись в базу данных, даже если ничего не изменилось.

INSERT ... ON DUPLICATE UPDATE работает примерно так же, как REPLACE, но позволяет вам указать, какие значения вы хотите обновить, потенциально даже добавляя другую информацию вместо вставленных значений (если вам это нужно).

Между REPLACE и ON DUPLICATE есть некоторые ключевые различия, и я предлагаю вам взглянуть на этот вопрос, чтобы получить более подробные сведения: Каковы практические различия между REPLACE и INSERT ... ON DUPLICATE KEY UPDATE в MySQL?

Другие вопросы по теме