Установка уникального ключа MySQL или проверка на дубликат в части приложения? - PullRequest
0 голосов
/ 31 января 2012

Какой из них более надежный и имеет лучшую производительность? Задать уникальный ключ MySQL и использовать INSERT IGNORE или сначала проверить, существуют ли данные в базе данных и действуют ли они в соответствии с результатом?

Если ответ второй, есть ли способ сделать один SQL-запрос вместо двух?

ОБНОВЛЕНИЕ: я спрашиваю, потому что мои коллеги в компании, в которой я работаю, считают, что решение таких проблем должно быть сделано в части приложения, которая является более надежной в соответствии с ними.

Ответы [ 3 ]

3 голосов
/ 31 января 2012

Ваше приложение не будет ловить дубликаты.

Два одновременных вызова могут вставить одни и те же данные, потому что каждый процесс не видит другого, пока ваше приложение проверяет уникальность. Каждый процесс считает, что можно вставлять.

Вы можете вызвать сериализацию, но у вас есть узкое место и ограничение производительности. И у вас будут другие клиенты, пишущие в базу данных, даже если это просто сценарий выпуска -

Именно поэтому существуют такие вещи, как уникальные индексы и ограничения в целом. Внешние ключи, триггеры, проверочные ограничения, NULL / NIOT NULL, ограничения типа данных - все это для обеспечения целостности данных

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

См. Programmers.se: Ограничения в реляционных базах данных - почему бы не удалить их полностью? и это Применение ограничений базы данных в коде приложения (SO)

2 голосов
/ 31 января 2012

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

1 голос
/ 31 января 2012

Вы определенно должны установить уникальный ключ в своей таблице MySQL, независимо от того, что вы решите.

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

Т.е., если вы собираетесь загружать кучу данных, и вам все равно, какими были старые данные, вы просто хотите новые данные, это путь.

С другой стороны, если есть какая-то ветвь принятия решения, основанная на том, является ли изменение обновлением или новым значением, я думаю, вам придется воспользоваться вариантом 2.

Т.е. если изменения в таблице записаны в другой таблице (например, table: change_log со столбцами: id, table, column, old_val, new_val), то вы не можете просто использовать INSERT IGNORE, потому что вы никогда не сможете сказать, какие значениябыли изменены по сравнению с недавно вставленными.

...