[Документация Yandex Cloud](../../index.md) > [Yandex Managed Service for Sharded PostgreSQL](../index.md) > [Концепции](index.md) > Ключи шардирования

# Ключи шардирования

Шардирование — это принцип горизонтального масштабирования распределенных баз данных, при котором база данных разбивается на части — [шарды](index.md). В Managed Service for Sharded PostgreSQL каждый шард является отдельным кластером Managed Service for PostgreSQL, который хранит часть данных всей системы.

[Подробнее о шардировании в Managed Service for Sharded PostgreSQL](sharding.md).

_Ключ шардирования_ — это один или несколько столбцов таблицы, по которым система определяет, в какой шард будет помещена строка. Если ключ состоит из нескольких столбцов, он называется [составным](#composite_keys).

Столбцы ключа могут быть следующих типов данных:

* целые числа `int` и `bigint`;
* строки `varchar`;
* уникальные идентификаторы `UUID`;
* хеш-функции `CITY` и `MURMUR` (только для целых чисел).

## Стратегии шардирования {#sharding-strategies}

Строки распределяются по шардам в зависимости от [выбранной стратегии](sharding-method.md):

* Range-стратегия — для выбора шарда используется диапазон значений. Строка помещается в шард, если значение ее ключа попадает в диапазон значений шарда. При этом строки с близкими значениями ключа будут находиться на одном шарде.

  > Например, на одном шарде будут храниться строки со значением ключа от `1` до `1000`, на другом — от `1001` до `2000` и т. д.

  Недостаток такой стратегии в том, что данные могут распределяться неравномерно.
  
  [Подробнее о range-стратегии в Sharded PostgreSQL](https://docs.pg-sharding.tech/sharding/ranged).

* Hash-стратегия — для выбора шарда используется хеш-функция, которая применяется к значению ключа. Полученное хеш-значение определяет шард, в который будет помещена строка. Эта стратегия обеспечивает более равномерное распределение данных между шардами, чем range-стратегия. Однако выборка по диапазону значений усложняется, так как строки с близкими значениями могут находиться на разных шардах.
  
  [Подробнее о hash-стратегии в Sharded PostgreSQL](https://docs.pg-sharding.tech/sharding/hashed).
  
## Составные ключи шардирования {#composite-keys}

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

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

* временные ряды;
* географические данные, которые представлены несколькими связанными столбцами.

При использовании составного ключа шард, в который будет помещена строка, определяется следующим образом:

* Для range-стратегии перечисляются все комбинации значений столбцов.

  > Пример настройки правил шардирования для range-стратегии:
  >
  > ```sql
  > CREATE DISTRIBUTION ds1 COLUMN TYPES integer, integer;
  > CREATE KEY RANGE FROM 100,100 ROUTE TO sh4 FOR DISTRIBUTION ds1;
  > CREATE KEY RANGE FROM 100,0 ROUTE TO sh3 FOR DISTRIBUTION ds1;
  > CREATE KEY RANGE FROM 0,100 ROUTE TO sh2 FOR DISTRIBUTION ds1;
  > CREATE KEY RANGE FROM 0,0 ROUTE TO sh1 FOR DISTRIBUTION ds1;
  > ```

* Для hash-стратегии хеш-функция применяется к каждому столбцу ключа отдельно. Полученные числа суммируются и к сумме применяется хеш-функция.

  > Пример настройки правил шардирования для hash-стратегии:
  >
  > ```sql
  > CREATE RELATION tr(MURMUR [id1 INT HASH, id2 VARCHAR HASH]);
  >  
  > CREATE KEY RANGE FROM 3221225472 ROUTE TO sh4;
  > CREATE KEY RANGE FROM 2147483648 ROUTE TO sh3;
  > CREATE KEY RANGE FROM 1073741824 ROUTE TO sh2;
  > CREATE KEY RANGE FROM 0 ROUTE TO sh1;
  > ```

  Использование hash-стратегии упрощает настройку правил шардирования.

[Подробнее о составных ключах шардирования в Sharded PostgreSQL](https://docs.pg-sharding.tech/sharding/composite_keys).

### Рекомендации по использованию составных ключей {#best-practices}

* Первым указывайте столбец, который чаще всего используется в запросах. При этом, если вы используете range-стратегию, первым указывайте столбец, который часто встречается в запросах и имеет как можно меньше уникальных значений.
* Убедитесь, что условия `WHERE` включают все столбцы составного ключа. Если в запросе указаны не все столбцы и настройка [query_routing.default_route_behaviour](https://docs.pg-sharding.tech/configuration/router#query-routing-settings) установлена в `BLOCK`, то такие запросы будут отклонены.