Несколько записей в реляционной базе данных - PullRequest
1 голос
/ 31 августа 2011

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

Ответы [ 2 ]

0 голосов
/ 31 августа 2011

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

Выполнение всех ваших записей за один раз создает особую проблему: данные хранятся в базе данных, пока вы не положите их туда. Если вы ожидаете некоторого порога оптимизации (скажем, 50), то транзакции 1 придется ждать (не связанных) транзакций 2-50 для завершения, прежде чем она перейдет в базу данных. Это означает, что за среднее время (которое может составлять несколько [секунд, минут, часов]) никто не знает, что это за записи, и обновляются ли они новыми значениями. (То же самое с чтениями, но наоборот. Ваши данные могут устареть к тому времени, когда вы их используете.)

С точки зрения производительности, я не могу себе представить, что объединение записей ближе друг к другу не будет иметь некоторой производительности. (ЕСЛИ это сбивало с толку чтение, я имел в виду «Вы всегда должны повышать производительность, группируя».) Если ничего другого, у вас больше шансов получить доступ к кэшам памяти, а не к дискам, чем если бы вы делали их отдельно. @Darhazer поднимает вопрос о блокировке. Строго говоря, с точки зрения общего времени, потраченного на написание, было бы лучше сгруппировать их. С точки зрения производительности приложения трудно сказать без глубоких знаний бизнес-требований приложения.

0 голосов
/ 31 августа 2011

Вероятно, зависит от СУБД и механизма хранения, но, по крайней мере, в MySQL / InnoDB, множественные записи в одной транзакции (а также синтаксис с несколькими вставками, который, на самом деле, является расширением MySQL), позволяет вам не обновлятьуникальные индексы перед фиксацией транзакции, и обновление индекса происходит сразу со всеми новыми значениями (так как это b-дерево, таким образом, оно намного быстрее).Возможно, что СУБД оптимизирует и другие записи, чтобы иметь последовательные, а не случайные записи.

Кроме того, если есть блокировка на уровне таблицы (как в MyISAM), блокировка таблицы один раз, запись нескольких записей, а затемРазблокировка снимает издержки блокировки / разблокировки для каждой записи.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...