
- Главная
- Каталог
- Интернет технологии
- DEV Community | CMD
Статистика канала
SELECT * FROM posts ORDER BY id LIMIT 10 OFFSET 50000. Кажется, что всё ок, но для базы данных это тяжелое испытание. 😰
В чем проблема? 📉
— Пропуск строк: Чтобы отдать 10 строк после OFFSET 50000, СУБД должна честно прочитать первые 50 000 строк с диска, отсортировать их и только потом выбросить, оставив нужный кусочек.
— Нагрузка на диск: Чем дальше пользователь листает страницы, тем медленнее работает сайт. На больших офсетах запрос может занимать секунды.
— Нестабильность: Если пока пользователь переходит с 1-й на 2-ю страницу, кто-то добавил новый пост, данные «сдвинутся», и юзер увидит один и тот же пост дважды. 🔄
Как делать правильно? (Keyset Pagination / Cursor) 🛠️
Вместо номера страницы передавай ID последнего элемента с предыдущей страницы:
SELECT * FROM posts WHERE id > :last_id ORDER BY id LIMIT 10;
Плюсы такого подхода: 🚀
— Скорость: База использует индекс по id и мгновенно находит нужную точку входа. Сложность запроса всегда одинакова, неважно, 1-я это страница или 10 000-я.
— Консистентность: Новые записи в начале таблицы не сдвигают текущую выдачу для пользователя.
— Идеально для бесконечных лент: Именно так работают ленты в соцсетях. 📱
> Когда оставить OFFSET? Только если у тебя маленькие таблицы (до пары тысяч строк) или если пользователю критично иметь возможность прыгнуть сразу на 574-ю страницу. В остальных случаях — используй курсоры. 💎JSONB давно умеет работать с документами не хуже, сохраняя при этом все плюсы реляционной базы.
В чем разница между JSON и JSONB? ⚖️
— JSON: Сохраняет текст «как есть». Быстрая запись, но медленный поиск, так как базе нужно парсить строку при каждом запросе.
— JSONB (Binary): Сохраняет данные в скомпилированном бинарном формате. Запись чуть медленнее, зато поиск — реактивный. 🚀
Главные фишки JSONB: 🛠️
— Индексация: Ты можешь создать GIN-индекс на всё содержимое JSON-поля. После этого поиск по ключам внутри документа будет работать мгновенно.
— Операторы: Postgres дает мощный синтаксис. Например, оператор @> проверяет, содержит ли JSON определенную пару ключ-значение.
— Схема на лету: Нужно добавить поле «настройки уведомлений» только для 5% пользователей? Просто закинь это в JSONB, не делая тяжелых миграций ALTER TABLE. 🏗️
Когда НЕ стоит использовать JSONB? 🛑
— Если данные имеют четкую структуру и они всегда присутствуют — обычные колонки эффективнее и занимают меньше места.
— Если тебе нужна строгая валидация типов на уровне БД (хотя в новых версиях можно вешать CHECK на структуру JSON).
> Итог: JSONB — идеальный выбор для хранения метаданных, логов событий или динамических атрибутов товара. Это дает гибкость NoSQL без отказа от ACID и мощных JOIN-ов. 💎Retry-After, чтобы клиент знал, через сколько секунд можно повторить попытку.
> Итог: Rate Limiting — это не только про безопасность, но и про предсказуемость работы твоей системы. Начинай с простых лимитов в Nginx, пока проект не вырос. 🚀VARCHAR(255) по инерции. Но задумывался ли ты, что там происходит на самом деле?
Почему длина имеет значение? 📏
— Алгоритм хэширования: Современные алгоритмы, такие как Argon2 или bcrypt, генерируют строку фиксированной длины. Например, bcrypt всегда выдает 60 символов. Использование слишком большого поля просто тратит место (хотя в современных БД это не критично).
— Атака на отказ в обслуживании (DoS): Если ты не ограничишь длину входящего пароля в API (например, до 72 символов для bcrypt), злоумышленник может отправить пароль длиной в 1 МБ. Хэширование такой огромной строки сожрет CPU сервера и «положит» его. 🛑
Как делать правильно? 🛠️
— Храни только хэш: Никогда, ни при каких обстоятельствах не храни пароли в открытом виде. Даже если это «временное решение для тестов». 🙅♂️
— Соль (Salt): Всегда используй соль, чтобы защититься от радужных таблиц. Современные библиотеки делают это автоматически и включают соль в строку хэша.
— Work Factor: Настраивай сложность хэширования (cost) так, чтобы проверка занимала около 200–500 мс. Этого достаточно, чтобы не бесить пользователя, но сделать перебор невыгодным. ⏳
> Совет: Используй тип данных TEXT в Postgres, если не хочешь мучиться с лимитами, но всегда делай валидацию длины входной строки на уровне приложения перед отправкой в хэш-функцию. 🚀DEFAULT могло заблокировать таблицу на чтение и запись, пока база переписывает все строки на диске. 🛑
— Используй транзакции: Миграция должна быть атомарной. Либо применилось всё, либо ничего. Если на середине процесса вылетит ошибка, база не должна остаться в "промежуточном" состоянии. 🔄
— Разделяй код и миграции: Сначала деплоим миграцию, которая добавляет новую колонку, и только вторым этапом — код, который начинает в неё писать. Так мы избежим ошибок, если старый код увидит незнакомую структуру. 🛠️
— Обратимость (Rollback): На каждую миграцию UP должна быть написана миграция DOWN. Если что-то пошло не так, у тебя должен быть план быстрого отката. ⏪
Инструменты, которые маст-хэв:
— Go: golang-migrate или goose
— Python: Alembic
— Node.js: Knex или Sequelize
> Совет: Перед запуском на проде всегда проверяй миграцию на копии реальных данных. То, что на 10 строках летит за миллисекунду, на 10 миллионах может выполняться часы. ⏳Hystrix (архив), Resilience4j (Java), Gobreaker (Go), Opossum (Node.js).Отзывы канала
всего 2 отзыва
- Добавлен: Сначала новые
- Добавлен: Сначала старые
- Оценка: По убыванию
- Оценка: По возрастанию
Каталог Телеграм-каналов для нативных размещений
DEV Community | CMD — это Telegam канал в категории «Интернет технологии», который предлагает эффективные форматы для размещения рекламных постов в Телеграмме. Количество подписчиков канала в 3.0K и качественный контент помогают брендам привлекать внимание аудитории и увеличивать охват. Рейтинг канала составляет 6.6, количество отзывов – 2, со средней оценкой 5.0.
Вы можете запустить рекламную кампанию через сервис Telega.in, выбрав удобный формат размещения. Платформа обеспечивает прозрачные условия сотрудничества и предоставляет детальную аналитику. Стоимость размещения составляет 699.3 ₽, а за 7 выполненных заявок канал зарекомендовал себя как надежный партнер для рекламы в TG. Размещайте интеграции уже сегодня и привлекайте новых клиентов вместе с Telega.in!
Вы снова сможете добавить каналы в корзину из каталога
Комментарий