В MySQL и Postgres есть несколько режимов репликации.
Один вариант — асинхронная репликация. Primary фиксирует транзакции и сразу отвечает клиенту, не дожидаясь подтверждения от реплик. Быстро, но с риском потери данных при отказе primary
Противоположность — синхронная репликация. Primary принимает запись, рассылает её всем фолловерам и ждёт, пока они закоммитят и пришлют ack. Только потом отправляет ответ. Такой режим даёт максимальную надёжность и консистентность, но замедляет запись.
Есть и промежуточный вариант — полусинхронная репликация. Primary ждёт ответа только от первой реплики (или первых N реплик), после чего отвечает клиенту. Можно ждать не полный commit, а лишь запись в лог. Это компромисс между скоростью и сохранностью данных.
Здесь приведены термины из MySQL, но в Postgres похожее можно настроить через параметры
В итоге выбор зависит от ваших приоритетов: важнее ли скорость записи или устойчивость и консистентность данных.
👉 @SQLPortal
Один вариант — асинхронная репликация. Primary фиксирует транзакции и сразу отвечает клиенту, не дожидаясь подтверждения от реплик. Быстро, но с риском потери данных при отказе primary
Противоположность — синхронная репликация. Primary принимает запись, рассылает её всем фолловерам и ждёт, пока они закоммитят и пришлют ack. Только потом отправляет ответ. Такой режим даёт максимальную надёжность и консистентность, но замедляет запись.
Есть и промежуточный вариант — полусинхронная репликация. Primary ждёт ответа только от первой реплики (или первых N реплик), после чего отвечает клиенту. Можно ждать не полный commit, а лишь запись в лог. Это компромисс между скоростью и сохранностью данных.
Здесь приведены термины из MySQL, но в Postgres похожее можно настроить через параметры
synchronous_standby_names
и synchronous_commit
В итоге выбор зависит от ваших приоритетов: важнее ли скорость записи или устойчивость и консистентность данных.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍5
Клауза
Затем функция возвращает накопительный итог в рамках окна
Это включает все строки, у которых значение сортировки меньше либо равно значению текущей строки.
👉 @SQLPortal
ORDER BY
в оконных функциях SQL сортирует строки.Затем функция возвращает накопительный итог в рамках окна
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
Это включает все строки, у которых значение сортировки меньше либо равно значению текущей строки.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Апдейт Postgres 18: индексируемые UUID
Postgres 18 сейчас в бете и выйдет в продакшен этой осенью.
В
UUID — это случайно сгенерированные строки, которые по определению глобально уникальны.
Почему UUID хороши для первичных ключей
1. Уникальность — можно генерировать ключи в разных местах.
2. Развязка — приложение может создать первичный ключ ещё до того, как отправит данные в БД.
3. Безопасность — если в URL используются ID (
С UUID (
Что изменилось
- Раньше в Postgres нативно поддерживался UUIDv4, но сортировка и индексация в больших таблицах работала медленно.
- UUIDv7 решает проблему сортировки и индексации.
Он по-прежнему случайный, но первые 48 бит (12 символов) — это таймстамп, остальные биты остаются случайными.
Таймстамп
Таймстамп хранится в hex (по сути сжатое десятичное число).
Пример:
что соответствует количеству миллисекунд с 1970 года.
Пример DDL для UUIDv7
Если раньше у тебя были проблемы с UUID -сейчас можно уже попробовать бету
👉 @SQLPortal
Postgres 18 сейчас в бете и выйдет в продакшен этой осенью.
В
uuid
добавили поддержку UUIDv7. UUID — это случайно сгенерированные строки, которые по определению глобально уникальны.
Почему UUID хороши для первичных ключей
1. Уникальность — можно генерировать ключи в разных местах.
2. Развязка — приложение может создать первичный ключ ещё до того, как отправит данные в БД.
3. Безопасность — если в URL используются ID (
.../users/5
), атакующий легко подберёт другие (.../users/6
, .../users/7
) и увидит общее количество пользователей. С UUID (
.../users/f47ac10b-58cc-4372-a567-0e02b2c3d479
) такое невозможно. Что изменилось
- Раньше в Postgres нативно поддерживался UUIDv4, но сортировка и индексация в больших таблицах работала медленно.
- UUIDv7 решает проблему сортировки и индексации.
Он по-прежнему случайный, но первые 48 бит (12 символов) — это таймстамп, остальные биты остаются случайными.
Таймстамп
Таймстамп хранится в hex (по сути сжатое десятичное число).
Пример:
0189d6e4a5d6
(hex) = 2707238289622
(decimal), что соответствует количеству миллисекунд с 1970 года.
Пример DDL для UUIDv7
CREATE TABLE user_actions (
action_id UUID PRIMARY KEY DEFAULT uuidv7(),
user_id BIGINT NOT NULL,
action_description TEXT,
action_time TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
Если раньше у тебя были проблемы с UUID -сейчас можно уже попробовать бету
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤3
В SQL можно комбинировать
Это делит строки на группы по значению
а затем считает накопительный итог внутри каждой группы.
По умолчанию берутся строки, у которых значение сортировки меньше или равно текущей строке группы.
👉 @SQLPortal
PARTITION BY
и ORDER BY
в оконных функциях.Это делит строки на группы по значению
PARTITION BY
,а затем считает накопительный итог внутри каждой группы.
По умолчанию берутся строки, у которых значение сортировки меньше или равно текущей строке группы.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤2
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤2
This media is not supported in your browser
VIEW IN TELEGRAM
Выбирай нужное и обучайся:
385 ГБ — Python
229 ГБ — JS, HTML, CSS
422 ГБ — C, C++, C#
147 ГБ — Java, PHP
202 ГБ — Rust, Golang
352 ГБ — Flutter, Kotlin, Swift
168 ГБ — DevOps, СисАдмин
242 ГБ — ИБ, Хакинг
122 ГБ — Windows, Linux
107 ГБ — Git, GitHub
242 ГБ — БД (SQL и NoSQL)
163 ГБ — QA-тестирование
108 ГБ — ИИ, Machine Learning
189 ГБ — Разработка игр
171 ГБ — Разработка ботов
612 ГБ — Собеседования в IT
3942 ГБ — Другие направления
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🤯2🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Как B- и B+-деревья лежат в основе индексов в базах данных (например, InnoDB в MySQL), почему размер и тип первичного ключа (например, BIGINT против UUID) напрямую влияют на глубину дерева, порядок хранения и количество I/O, и как это отражается на скорости поиска и диапазонных запросов
https://planetscale.com/blog/btrees-and-database-indexes
👉 @SQLPortal
https://planetscale.com/blog/btrees-and-database-indexes
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2