У меня есть уникальный столбец в моей таблице, который представляет собой длинную строку id, созданную приложением.
Теперь быстрее, если я просто использую INSERT, и если этот id уже существует в таблице, ничего не произойдет, или лучше сначала проверить с помощью SELECT, что id уже находится в таблице, и если это не так, я вставляю Это?
Слишком много возможных переменных для общего ответа. Вы должны протестировать производительность со своей схемой и данными.
... не говоря уже о неясных, слишком общих и, возможно, основанных на мнениях.
Почему, черт возьми, кто-то проголосовал за это. Этот вопрос не соответствует правилам сайта
@IsThisJavascript Я и сам думал об этом.
Контекст того, что вы делаете, также может быть решающим фактором. Если идентификатор уже существует, вы хотите узнать информацию, которая уже была вставлена? Если это так, то вы, вероятно, сначала захотите SELECT. Если идентификатор уже существует, хотите ли вы записать UPDATE в существующую запись? Если да, то вам, вероятно, захочется INSERT INTO ... ON DUPLICATE KEY UPDATE. Здесь вам не хватает много полезной информации.
@verhie У меня уже есть столбец auto_increment. Это еще один идентификатор, сгенерированный приложением, это длинная строка.
Это недалеко от ответа @PatrickQ. У меня была такая же мысль раньше, и я собирался забить ее чем-то похожим, но это должно было оспариваться, поэтому я просто проголосовал за то, чтобы быть слишком широким.






При прочих равных, я ожидаю, что простая вставка будет быстрее, если строка не существует, поскольку в противном случае вы выполняете два оператора - проверку и вставку. Обратной стороной является то, что если строка действительно существует, ваш вызов выдаст ошибку, которую вам затем придется обработать.
В зависимости от желаемого поведения у вас есть несколько вариантов:
Проверьте, существует ли, как вы упомянули. Это хорошо, если вы не хотите ничего менять в существующей записи с новой информацией. Затем обработайте свои ошибки, чтобы их не подтолкнули к вызову.
INSERT IGNORE игнорирует любые повторяющиеся ключевые ошибки; он также проигнорирует любые другие ошибки, поэтому я бы не советовал этого вообще.
REPLACE выполняет базовую команду стиля UPSERT: вставляет, если дубликаты не обнаружены, обновляет, если дубликаты не обнаружены. «Стоимость» заключается в том, что вы всегда записываете полную запись в базу данных, даже если ничего не изменилось.
INSERT ... ON DUPLICATE UPDATE работает примерно так же, как REPLACE, но позволяет вам указать, какие значения вы хотите обновить, потенциально даже добавляя другую информацию вместо вставленных значений (если вам это нужно).
Между REPLACE и ON DUPLICATE есть некоторые ключевые различия, и я предлагаю вам взглянуть на этот вопрос, чтобы получить более подробные сведения: Каковы практические различия между REPLACE и INSERT ... ON DUPLICATE KEY UPDATE в MySQL?
Или, что еще лучше, сделайте auto_increment и пусть MySQL сделает это за вас.