Горизонтальное разбиение (также известное как sharding ) улучшает общую производительность чтения / записи
Горизонтальное разбиение предполагает размещение разных строк в разных таблицах. Возможно, клиенты с почтовыми индексами менее 50000 хранятся в CustomersEast, а клиенты с почтовыми индексами, большими или равными 50000, хранятся в CustomersWest. Тогда две таблицы разделов - это CustomersEast и CustomersWest, хотя для обоих клиентов может быть создано представление с объединением, чтобы обеспечить полное представление всех клиентов.
Горизонтальное разбиение - это принцип проектирования базы данных, при котором строки таблицы базы данных хранятся отдельно, а не разбиваются по столбцам (как для нормализации). Каждый раздел является частью сегмента, который, в свою очередь, может находиться на отдельном сервере базы данных или в физическом местоположении.
У этого подхода к разделению есть множество преимуществ. Общее количество строк в каждой таблице уменьшается. Это уменьшает размер индекса, что обычно повышает производительность поиска. Осколок базы данных может быть размещен на отдельном оборудовании, а несколько сегментов могут быть размещены на нескольких компьютерах. Это позволяет распределять базу данных по большому количеству машин, что означает, что производительность базы данных может быть распределена по нескольким машинам, что значительно повышает производительность. Кроме того, если осколок базы данных основан на некоторой реальной сегментации данных (например, европейские клиенты против американских клиентов), тогда можно будет легко и автоматически вывести соответствующее членство в разделе и запросить только соответствующий фрагмент.
На практике осколок гораздо сложнее, чем этот. Хотя это было сделано в течение длительного времени ручным кодированием (особенно там, где строки имеют очевидную группировку, как в примере выше), это часто негибко. Существует желание поддерживать автоматическое разбиение как с точки зрения добавления поддержки кода для него, так и для идентификации кандидатов, которые должны быть выделены отдельно.
В тех случаях, когда распределенные вычисления используются для разделения нагрузки между несколькими серверами (из соображений производительности или надежности), также может быть полезен подход сегрегации.
Осколки по сравнению с горизонтальным разделением
Горизонтальное разбиение разделяет одну или несколько таблиц по строкам, как правило, в пределах одного экземпляра схемы и сервера базы данных. Это может дать преимущество за счет уменьшения размера индекса (и, следовательно, усилий по поиску), при условии, что существует некоторый очевидный, надежный, неявный способ определения, в какой таблице будет найдена конкретная строка, без необходимости предварительного поиска в индексе, например классический пример таблиц CustomersEast и CustomersWest, где их почтовый индекс уже указывает, где они будут найдены.
Sharding выходит за рамки этого: он разделяет проблемные таблицы аналогичным образом, но делает это потенциально между несколькими экземплярами схемы. Очевидным преимуществом будет то, что поисковая нагрузка для большой многораздельной таблицы теперь может быть разделена на несколько серверов (логических или физических), а не только на несколько индексов на одном логическом сервере.
Для разделения осколков на несколько изолированных экземпляров требуется нечто большее, чем простое горизонтальное разбиение.Ожидаемый выигрыш в эффективности был бы потерян, если бы запрос к базе данных требовал запрашивать оба экземпляра, просто чтобы получить простую таблицу измерений.Помимо разбиения, сегментирование, таким образом, разделяет большие разделяемые таблицы на серверах, в то время как меньшие таблицы реплицируются в них в массовом порядке.
По этой же причине сегментирование связано с архитектурой без общего доступа - после разделения каждый сегмент может житьсовершенно отдельный экземпляр логической схемы / физический сервер базы данных / центр обработки данных / континент.В настоящее время нет необходимости сохранять общий доступ (между сегментами) к другим нераспределенным таблицам в других сегментах.
Это упрощает репликацию между несколькими серверами (простое горизонтальное разбиение не может).Это также полезно для распространения приложений по всему миру, где каналы связи между центрами обработки данных в противном случае были бы узким местом.
Очевидно, что существует также необходимость в некотором механизме уведомлений и репликации между экземплярами схемы, чтобы нераздельные таблицы оставалисьсинхронизированы так, как требует приложение.Это сложный выбор в архитектуре сегментированных систем: подходы варьируются от обеспечения эффективного доступа только для чтения (обновления являются редкими и пакетными), до динамически реплицируемых таблиц (за счет уменьшения некоторых преимуществ распределения сегментирования) и многих вариантов.между ними.