Почему Redis такой быстрый (несмотря на однопоточность)?
🔹 Хранение в памяти
Redis хранит все данные в оперативной памяти, где время доступа измеряется наносекундами, а не миллисекундами.
🔹 Однопоточный цикл событий
Redis обрабатывает команды в одном потоке, избегая блокировок, гонок и переключений контекста. Благодаря мультиплексированию ввода-вывода он эффективно обслуживает тысячи одновременных подключений через цикл событий.
🔹 Оптимизированные структуры данных
Redis предоставляет специализированные реализации списков, множеств, отсортированных множеств и хешей, оптимизированные для производительности и экономии памяти.
🔹 Эффективность ввода-вывода
Redis использует лёгкий текстовый протокол RESP для обработки сетевого I/O и поддерживает конвейеризацию, позволяя клиентам отправлять несколько команд в одном запросе.
🔹 Скрипты на стороне сервера
Встроенный движок Lua даёт возможность выполнять сложные многошаговые операции атомарно на сервере, убирая необходимость лишних сетевых запросов.
♻️ Сделай репост, чтобы помочь другим.
#db
👉 @database_info
🔹 Хранение в памяти
Redis хранит все данные в оперативной памяти, где время доступа измеряется наносекундами, а не миллисекундами.
🔹 Однопоточный цикл событий
Redis обрабатывает команды в одном потоке, избегая блокировок, гонок и переключений контекста. Благодаря мультиплексированию ввода-вывода он эффективно обслуживает тысячи одновременных подключений через цикл событий.
🔹 Оптимизированные структуры данных
Redis предоставляет специализированные реализации списков, множеств, отсортированных множеств и хешей, оптимизированные для производительности и экономии памяти.
🔹 Эффективность ввода-вывода
Redis использует лёгкий текстовый протокол RESP для обработки сетевого I/O и поддерживает конвейеризацию, позволяя клиентам отправлять несколько команд в одном запросе.
🔹 Скрипты на стороне сервера
Встроенный движок Lua даёт возможность выполнять сложные многошаговые операции атомарно на сервере, убирая необходимость лишних сетевых запросов.
♻️ Сделай репост, чтобы помочь другим.
#db
👉 @database_info
👍14🔥2
Media is too big
VIEW IN TELEGRAM
Базы данных. Школа бэкенд-разработки 2025
На лекции обсудим основные понятия и принципы работы с базами данных. Рассмотрим факторы, влияющие на выбор подходящей базы данных для конкретной задачи. Познакомимся с индексами и их ролью в ускорении запросов. Поделимся советами по оптимальному использованию баз данных и рекомендациями для эффективной работы
источник
#db
👉 @database_info
На лекции обсудим основные понятия и принципы работы с базами данных. Рассмотрим факторы, влияющие на выбор подходящей базы данных для конкретной задачи. Познакомимся с индексами и их ролью в ускорении запросов. Поделимся советами по оптимальному использованию баз данных и рекомендациями для эффективной работы
источник
#db
👉 @database_info
👍3❤2
Почему индекс в PostgreSQL не всегда спасает
Индексы - мощный инструмент, но не панацея. Иногда запрос с индексом работает медленнее, чем без него. Почему?
1️⃣ Маленькая выборка - да, полное сканирование - нет
Если таблица маленькая (до нескольких тысяч строк), PostgreSQL может решить, что быстрее прочитать всё целиком, чем прыгать по индексу.
План покажет
2️⃣ Индекс не помогает с функциями в WHERE
Запрос вида:
не использует индекс по
3️⃣ Селективность
Если по условию отбирается больше ~5–10% строк, индекс становится невыгодным — чтение с диска и так почти сплошное.
4️⃣ Статистика устарела
PostgreSQL выбирает план по статистике. Если она старая - план может быть неэффективным.
- и жизнь наладится.
💡 Вывод: Индекс - не магическая кнопка «ускорить». Следи за планами запросов (
Сохрани, чтобы не наступить на этот грабельный индекс 🚀
#db
👉 @database_info
Индексы - мощный инструмент, но не панацея. Иногда запрос с индексом работает медленнее, чем без него. Почему?
1️⃣ Маленькая выборка - да, полное сканирование - нет
Если таблица маленькая (до нескольких тысяч строк), PostgreSQL может решить, что быстрее прочитать всё целиком, чем прыгать по индексу.
EXPLAIN ANALYZE
SELECT * FROM users WHERE status = 'active';
План покажет
Seq Scan
, и это не баг.2️⃣ Индекс не помогает с функциями в WHERE
Запрос вида:
SELECT * FROM orders WHERE DATE(created_at) = '2025-08-12';
не использует индекс по
created_at
. Решение — переписать условие:
WHERE created_at >= '2025-08-12' AND created_at < '2025-08-13'
3️⃣ Селективность
Если по условию отбирается больше ~5–10% строк, индекс становится невыгодным — чтение с диска и так почти сплошное.
4️⃣ Статистика устарела
PostgreSQL выбирает план по статистике. Если она старая - план может быть неэффективным.
ANALYZE table_name;
- и жизнь наладится.
💡 Вывод: Индекс - не магическая кнопка «ускорить». Следи за планами запросов (
EXPLAIN
), обновляй статистику и оптимизируй условия.Сохрани, чтобы не наступить на этот грабельный индекс 🚀
#db
👉 @database_info
👍16
Антипаттерны JOIN-ов в SQL и как их избежать
JOIN - мощная штука, но может легко превратиться в генератор тормозов и дублей. Вот топ-4 ловушек:
1️⃣ Забыли условие соединения
Без
✅ Как избежать: Всегда указывай условие соединения.
2️⃣ JOIN по неиндексированным колонкам
Если соединяешь большие таблицы по полю без индекса - готовься ждать.
✅ Как избежать: Добавь индекс на ключи соединения.
3️⃣ Фильтры в WHERE вместо ON
LEFT JOIN превратился в INNER JOIN, потому что фильтр в WHERE отсекает NULL-строки.
✅ Как избежать: Фильтруй в ON, если хочешь сохранить LEFT JOIN:
4️⃣ SELECT *** в сложных JOIN-ах
Такая выборка тянет все колонки всех таблиц. Много лишних данных + риск коллизии имён колонок.
✅ Как избежать: Явно указывай нужные поля.
💡 Вывод: JOIN - как скальпель. В умелых руках ускоряет, в неумелых - режет производительность.
Сохрани, чтобы не резануть базу не туда ✂️
#db
👉 @database_info
JOIN - мощная штука, но может легко превратиться в генератор тормозов и дублей. Вот топ-4 ловушек:
1️⃣ Забыли условие соединения
SELECT *
FROM orders
JOIN customers;
Без
ON
это картезианское произведение - каждая строка первой таблицы умножается на все строки второй. Легко получить миллионы ненужных записей.✅ Как избежать: Всегда указывай условие соединения.
2️⃣ JOIN по неиндексированным колонкам
Если соединяешь большие таблицы по полю без индекса - готовься ждать.
✅ Как избежать: Добавь индекс на ключи соединения.
CREATE INDEX idx_orders_customer_id ON orders(customer_id);
3️⃣ Фильтры в WHERE вместо ON
-- Плохо
FROM orders
LEFT JOIN customers ON orders.customer_id = customers.id
WHERE customers.region = 'EU';
LEFT JOIN превратился в INNER JOIN, потому что фильтр в WHERE отсекает NULL-строки.
✅ Как избежать: Фильтруй в ON, если хочешь сохранить LEFT JOIN:
LEFT JOIN customers
ON orders.customer_id = customers.id AND customers.region = 'EU';
4️⃣ SELECT *** в сложных JOIN-ах
Такая выборка тянет все колонки всех таблиц. Много лишних данных + риск коллизии имён колонок.
✅ Как избежать: Явно указывай нужные поля.
💡 Вывод: JOIN - как скальпель. В умелых руках ускоряет, в неумелых - режет производительность.
Сохрани, чтобы не резануть базу не туда ✂️
#db
👉 @database_info
👍13❤4
Конференция, на которую нужно прийти Data Engineers🔥
23 сентября пройдет Data Internals X 2025 — единственная в России конференция, где создатели СУБД и движков обработки данных делятся опытом работы с реальными production-системами экстремального масштаба. Вас ждёт по-настоящему "хардкорная" программа.
🎯 Глубина технических решений
Программа конференции сфокусирована на внутренних механизмах работы с данными — от разработки СУБД до оптимизации запросов и устойчивости к высоким нагрузкам. Это редкая возможность погрузиться в технические детали, которые обычно остаются за кадром.
🏭 Практический опыт масштабирования
Все доклады основаны на реальном опыте работы с петабайтными данными, высоконагруженными системами и решением production-задач в крупных компаниях (Яндекс, Сбер, VK, Т-Банк).
🔧 Импортозамещение и Open Source
Особый акцент на отечественные решения и open-source технологии, что критически важно в текущих реалиях.
🧠 Концентрированный опыт
Максимум пользы для повышения квалификации за один день: 20+ докладов, рекордная плотность экспертных знаний и нетворкинг с 300+ участниками.
📌Изучить расписание и забронировать билеты на сайте конференции
Приходите сами и приглашайте своих коллег 🔥
До встречи 23 сентября в Москве!
23 сентября пройдет Data Internals X 2025 — единственная в России конференция, где создатели СУБД и движков обработки данных делятся опытом работы с реальными production-системами экстремального масштаба. Вас ждёт по-настоящему "хардкорная" программа.
🎯 Глубина технических решений
Программа конференции сфокусирована на внутренних механизмах работы с данными — от разработки СУБД до оптимизации запросов и устойчивости к высоким нагрузкам. Это редкая возможность погрузиться в технические детали, которые обычно остаются за кадром.
🏭 Практический опыт масштабирования
Все доклады основаны на реальном опыте работы с петабайтными данными, высоконагруженными системами и решением production-задач в крупных компаниях (Яндекс, Сбер, VK, Т-Банк).
🔧 Импортозамещение и Open Source
Особый акцент на отечественные решения и open-source технологии, что критически важно в текущих реалиях.
🧠 Концентрированный опыт
Максимум пользы для повышения квалификации за один день: 20+ докладов, рекордная плотность экспертных знаний и нетворкинг с 300+ участниками.
📌Изучить расписание и забронировать билеты на сайте конференции
Приходите сами и приглашайте своих коллег 🔥
До встречи 23 сентября в Москве!
👍2
🚨 Антипаттерн: хранить пароли в базе "как есть"
Да, звучит как очевидный совет, но на практике до сих пор встречаются проекты, где пароль сохраняется в чистом виде или максимум в
🔑 Как правильно:
1. Никогда не храните пароль в открытом виде.
2. Используйте алгоритмы адаптивного хэширования:
–
–
–
3. Настраивайте "cost factor" (число итераций), чтобы усложнить брутфорс.
4. Добавляйте "соль" (salt) к каждому паролю. Обычно библиотеки делают это автоматически.
5. Для дополнительной защиты можно применять pepper — секрет, хранящийся вне БД (например, в конфиге или KMS).
❌ Плохой пример:
✅ Хороший пример (псевдокод):
💡 Итог: база данных не должна "знать" пароли пользователей. Она должна хранить только безопасные хэши.
Сохрани пост, чтобы потом показать тем, кто всё ещё пишет
#db
👉 @database_info
Да, звучит как очевидный совет, но на практике до сих пор встречаются проекты, где пароль сохраняется в чистом виде или максимум в
MD5()
. Это огромная брешь в безопасности: одна утечка = полный доступ злоумышленника.🔑 Как правильно:
1. Никогда не храните пароль в открытом виде.
2. Используйте алгоритмы адаптивного хэширования:
–
bcrypt
–
scrypt
–
Argon2
(считается современным стандартом).3. Настраивайте "cost factor" (число итераций), чтобы усложнить брутфорс.
4. Добавляйте "соль" (salt) к каждому паролю. Обычно библиотеки делают это автоматически.
5. Для дополнительной защиты можно применять pepper — секрет, хранящийся вне БД (например, в конфиге или KMS).
❌ Плохой пример:
INSERT INTO users (login, password) VALUES ('admin', MD5('123456'));
✅ Хороший пример (псевдокод):
hashed = bcrypt.hashpw(password, bcrypt.gensalt())
store_in_db(user, hashed)
💡 Итог: база данных не должна "знать" пароли пользователей. Она должна хранить только безопасные хэши.
Сохрани пост, чтобы потом показать тем, кто всё ещё пишет
MD5(password)
😉#db
👉 @database_info
👍3⚡1