"Это зависит."
Чтобы быть полным, есть другие вещи, которые нужно учитывать.
Во-первых, единственное, что отличает случайное обновление от дополнения, - это поиск головы. При случайном обновлении голова будет танцевать по всему блюду, тогда как в идеале аппенд будет просто отслеживать, как проигрыватель. Это также предполагает, что каждая запись на диск является полной записью и полностью независима от всех других операций записи.
Конечно, это в идеальном мире.
В большинстве современных баз данных каждое обновление обычно включает как минимум 2 записи. Один для фактических данных, другой для журнала.
В типичном сценарии, если вы обновите строку, база данных внесет изменения в память. Если вы зафиксируете эту строку, база данных подтвердит это, сделав заметку в журнале, сохранив фактическую грязную страницу в памяти. Позже, когда контрольные точки базы данных исправят грязные страницы на диске. Но когда он делает это, он сортирует блоки и записывает их настолько последовательно, насколько это возможно. Затем он запишет контрольную точку в журнал.
Во время восстановления, когда БД дала сбой и не смогла установить контрольную точку, база данных считывает журнал до последней контрольной точки, «перекатывает его вперед» и применяет эти изменения к фактической странице диска, отмечает последнюю контрольную точку, а затем делает систему доступной для сервис. * * 1013
Запись в журнал является последовательной, запись данных в основном последовательной.
Теперь, если журнал является частью обычного файла (типичного сегодня), вы записываете запись журнала, которая добавляется к файлу диска. СИСТЕМА ФАЙЛОВ затем (вероятно) добавит в журнал ITS, который вы только что внесли изменения, чтобы он мог обновить свои структуры локальной файловой системы. Позже файловая система также зафиксирует свои грязные страницы и сделает изменения метаданных постоянными.
Итак, вы можете видеть, что даже простое добавление может вызвать несколько записей на диск.
Теперь рассмотрим дизайн «только для добавления», такой как CouchDB. То, что сделает Couch, - это когда вы делаете простую запись, у него нет журнала. Файл представляет собой собственный журнал. Файлы Couch DB растут без конца и нуждаются в сжатии во время обслуживания. Но когда он выполняет запись, он записывает не только страницу данных, но и любые затронутые индексы. И когда на индексы влияют, то Couch перепишет всю ветвь изменения индекса с корня на лист. Таким образом, простая запись в этом случае может быть дороже, чем вы могли бы подумать.
Теперь, конечно, вы добавляете все случайные чтения, чтобы нарушить ваши случайные записи, и все это довольно быстро усложняется. Однако я понял, что хотя пропускная способность потоковой передачи является важным аспектом операций ввода-вывода, общие операции в секунду еще более важны. У вас может быть 2 диска с одинаковой пропускной способностью, но у диска с более медленным дисководом и / или скоростью головки будет меньше операций в секунду, только из времени перемещения головки и времени поиска диска.
В идеале, ваша БД использует выделенное сырое хранилище по сравнению с файловой системой для хранения, но большинство не делает этого сегодня. Преимущества хранилищ на основе файловых систем, как правило, перевешивают преимущества производительности.
Если вы работаете в файловой системе, то заранее выделенные последовательные файлы являются преимуществом, так что ваше «только добавление» не просто пропускает другие файлы в файловой системе, что делает их похожими на случайные обновления. Кроме того, используя предварительно выделенные файлы, ваши обновления просто обновляют структуры данных БД во время записи, а не структуры данных БД И файловой системы при расширении файла.
Размещение журналов, индексов и данных на отдельных дисках позволяет нескольким дискам работать одновременно с меньшими помехами. Ваш журнал действительно может быть добавлен только, например, по сравнению с борьбой со случайным чтением данных или обновлениями индекса.
Итак, все эти факторы влияют на пропускную способность БД.