Допустим, что у нас есть сервер MySQL с таблицей с ее основным ключом, определенным с помощью свойства UNIQUE. Мы получаем данные из нескольких распределенных систем, все из которых имеют одинаковую/аналогичную реализацию., который быстрее, или он считается плохим кодом
В какой-то момент мы попытаемся вставить пакет, например. 10 миллионов документов-строк, но мы хотим хранить данные только в том случае, если мы не нарушаем уникальное ограничение, какой подход будет быстрее/считается ok ..?
например
try {
//...try and insert the document
} catch(MySQLIntegrityConstraintViolationException e) {
//..do nothing, since this is already stored in the database
//move on to the next one..
}
или
//we try to find the document...
if(!documentFound) {
//we did not find a document with this id, so we can safely insert it..
//move on to the next one...
}
В моей голове им угадывать, что в обоих случаях идентификатор мы пытаемся вставить должен быть «найден», так как мы должны проверить ограничение уникальности , но какой из двух считается более или менее нормально в отношении его скорости?
Боковой вопрос: будет ли ответ/результат (с точки зрения, например, скорости) таким же, как Mysql, по отношению к mongoDB?
сделать тест уникальности исключительно в mysql. Если вы протестируете на PHP, тогда попробуйте вставить, вы откроете условие гонки, когда какой-то другой экземпляр того же скрипта может бекаснуть этот слот db за спиной вашего скрипта.Конечно, вы всегда можете использовать блокировки таблиц/строк на уровне SQL, чтобы предотвратить это, но они открывают другие проблемы. –
Я думаю, что первый подход лучше, потому что вам не нужно сначала «выбирать», особенно когда у вас есть миллионы строк в базе данных. – omainegra
Я не эксперт mysql, но я не думаю, что 'MySQLIntegrityConstraintViolationException' вызывается только тогда, когда у вас есть повторяющаяся запись, что означает, что это гораздо более безопасное решение. – user902383