Общие вопросы
Что такое YDB?
YDB — это распределенная отказоустойчивая NewSQL СУБД. YDB обеспечивает высокую доступность и масштабируемость, и, в то же время, строгую консистентность и поддержку ACID-транзакций. Для запросов используется диалект SQL (YQL).
YDB — это полностью управляемая база данных, для создания инстанса базы данных используется сервис управления базами данных YDB.
Какие возможности предоставляет YDB?
YDB обеспечивает высокую доступность и сохранность данных благодаря синхронной репликации в трех зонах доступности. Также YDB следит за равномерным распределением нагрузки на доступные аппаратные ресуры. Это значит, что не нужно заказывать ресурсы, Yandex Database автоматически выделяет и освобождает ресурсы, исходя из пользовательской нагрузки.
Какая модель консистентности используется в YDB?
Для чтения данных YDB использует модель строгой консистентности (непротиворечивости) данных.
Как проектировать первичный ключ?
Чтобы правильно спроектировать первичный ключ стоит придерживаться следующих правил.
-
Необходимо избегать ситуаций, когда основная часть нагрузки приходится на одну партицию таблицы. При равномерной нагрузке проще достигается высокая общая производительность.
Как следствие этого правила, не стоит в качестве первичного ключа таблицы использовать монотонно возрастающую последовательность, например, timestamp.
-
Чем меньше партиций таблиц будет задействованно во время исполнения запроса — тем быстрее он будет исполнен. Чтобы достичь большей производительности стоит руководствоваться правилом: один запрос — одна партиция.
-
Необходимо избегать ситуаций, при которых какая-то малая часть БД нагружена существенно больше, чем остальные части БД.
Подробнее читайте в разделе Проектирование схемы.
Как равномерно распределить нагрузку по партициям таблицы?
Для равномерного распределения нагрузки по партициям таблиц и увеличения общей производительности БД, можно использовать следующие техники.
-
Для избежания использования монотонно возрастающих значений первичного ключа можно:
- изменить порядок следования его компонентов;
- использовать хеш от значений ключевых колонок в качестве первичного ключа.
-
Необходимо уменьшать количество партиций таблиц, задействованных в одном запросе.
Подробнее читайте в разделе Приемы, позволяющие равномерно распределить нагрузку по партициям таблицы.
Можно ли использовать NULL в ключевой колонке?
В YDB все колонки, включая ключевые, могут содержать значение NULL
, однако использовать NULL
в качестве значений в ключевых колонках не рекомендуется.
По стандарту языка SQL (ISO/IEC 9075), значение NULL
нельзя сравнивать с другими значениями, вследствие чего, использование лаконичных конструкций SQL с простыми операторами сравнения может приводить, например, к тому что, строки, содержащие значение NULL, могут быть пропущены при фильтрации.
Существует ли оптимальный размер строки базы данных?
Для достижения высокой производительности не рекомендуется записывать в БД строки размером более 8 МБ и ключевые колонки размером более 2 КБ.
Подробнее существующие ограничения описаны в разделе Ограничения базы данных.
Как работают вторичные индексы в YDB?
Вторичные индексы в YDB — глобальные и могут быть неуникальными.
Подробнее читайте в разделе Вторичные индексы.
Как осуществляется постраничный вывод?
Для организации постраничного вывода рекомендуется последовательно выбирать данные, отсортированные по первичному ключу, ограничивая количество строк ключевым словом LIMIT
. Использование ключевого слова OFFSET
для решения этой задачи крайне не желательно.
Подробнее читайте в разделе Постраничный вывод.
Как эффективно загружать в YDB большие объёмы данных?
Для увеличения скорости загрузки больших объёмов данных необходимо следовать следующим рекомендациям:
-
При создании таблицы стоит явно указать необходимое количество партиций или их границы. Это поможет эффективно использовать пропускную способность системы сразу после начала загрузки данных, поскольку поможет избежать ненужных перепартиционирований таблицы.
-
Не стоит вставлять данные отдельными транзакциями для каждой строки. Более эффективно производить вставки по несколько строк (батчами). В этом случае накладные расходы на сам механизм транзакций будут меньше.
-
В дополнение к предыдущему пункту — в каждой транзакции (батче) вставляйте строки из уже отсортированного по первичному ключу набора данных, чтобы минимизировать количество партиций, затрагиваемых транзакцией.
-
Следует избегать последовательной записи данных в порядке возрастания или убывания значения первичного ключа, чтобы равномерно распределить нагрузку на все партиции таблицы.
Подробнее читайте в разделе Загрузка больших объёмов данных.
Как удалять устаревшие данные?
Для эффективного удаления устаревших данных рекомендуется использовать Time to Live (TTL).