Базы данных

Шпаргалка по SQL JOIN, PostgreSQL, MySQL, Redis, MongoDB, Kafka

🔗 SQL JOIN'ы

Тип JOIN SQL Описание
INNER JOIN SELECT * FROM A INNER JOIN B ON A.id = B.id Только совпадающие строки
LEFT JOIN SELECT * FROM A LEFT JOIN B ON A.id = B.id Все строки из A + совпадающие из B
RIGHT JOIN SELECT * FROM A RIGHT JOIN B ON A.id = B.id Все строки из B + совпадающие из A
FULL OUTER JOIN SELECT * FROM A FULL OUTER JOIN B ON A.id = B.id Все строки из обеих таблиц
CROSS JOIN SELECT * FROM A CROSS JOIN B Декартово произведение

🐘 PostgreSQL

Типы данных

Тип Описание
JSONB Бинарный JSON (индексируемый)
ARRAY Массивы (INTEGER[], TEXT[])
UUID Уникальный идентификатор
TSVECTOR Для полнотекстового поиска

Индексы

CREATE INDEX idx_name ON table(column);
CREATE INDEX idx_gin ON table USING GIN(jsonb_column);
CREATE INDEX idx_btree ON table USING BTREE(column);
CREATE UNIQUE INDEX idx_unique ON table(column);

EXPLAIN ANALYZE SELECT * FROM table WHERE column = 'value';

JSONB операции

SELECT data->'key' FROM table;
SELECT data->>'key' FROM table; -- текст
SELECT data @> '{"key": "value"}'::jsonb; -- содержит
SELECT data ? 'key'; -- существует ключ

CREATE INDEX ON table USING GIN (jsonb_column);

Upsert

INSERT INTO table (id, name) 
VALUES (1, 'John')
ON CONFLICT (id) 
DO UPDATE SET name = EXCLUDED.name;

🐬 MySQL

Индексы

CREATE INDEX idx_name ON table(column);
CREATE UNIQUE INDEX idx_unique ON table(column);
CREATE FULLTEXT INDEX idx_ft ON table(column);
SHOW INDEX FROM table;
EXPLAIN SELECT * FROM table WHERE column = 'value';

Транзакции

START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;

-- Откат
ROLLBACK;

Charset и Collation

CREATE TABLE table (
  name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
);

ALTER TABLE table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

🔴 Redis

Типы данных

Тип Команды
String SET, GET, INCR, DECR
Hash HSET, HGET, HGETALL
List LPUSH, RPUSH, LPOP, RPOP
Set SADD, SMEMBERS, SINTER
Sorted Set ZADD, ZRANGE, ZRANK

TTL

SET key value EX 3600  -- истечет через 3600 сек
EXPIRE key 3600        -- установить TTL
TTL key                -- проверить оставшееся время
PERSIST key            -- убрать TTL

Pub/Sub

PUBLISH channel message
SUBSCRIBE channel
UNSUBSCRIBE channel
PSUBSCRIBE pattern*  -- подписка по паттерну

Streams

XADD stream * field1 value1 field2 value2
XREAD STREAMS stream 0
XGROUP CREATE stream group $  -- создать consumer group
XREADGROUP GROUP group consumer STREAMS stream >

🍃 MongoDB

Операторы запросов

db.collection.find({ age: { $gte: 18, $lte: 65 } })
db.collection.find({ name: { $in: ['John', 'Jane'] } })
db.collection.find({ $or: [{ status: 'active' }, { role: 'admin' }] })
db.collection.find({ tags: { $all: ['tag1', 'tag2'] } })
db.collection.find({ email: { $regex: /@example\.com$/ } })

Индексы

db.collection.createIndex({ name: 1 })
db.collection.createIndex({ name: 1, age: -1 })  -- составной
db.collection.createIndex({ location: '2dsphere' })  -- гео
db.collection.createIndex({ text: 'text' })  -- текстовый
db.collection.getIndexes()
db.collection.explain().find({ name: 'John' })

Aggregation

db.collection.aggregate([
  { $match: { status: 'active' } },
  { $group: { _id: '$category', total: { $sum: '$amount' } } },
  { $sort: { total: -1 } },
  { $limit: 10 }
])

📨 Kafka

Topics и Partitions

# Создать topic
kafka-topics --create --topic my-topic --partitions 3 --replication-factor 2

# Список topics
kafka-topics --list

# Информация о topic
kafka-topics --describe --topic my-topic

Consumer Groups

# Список consumer groups
kafka-consumer-groups --list

# Информация о группе
kafka-consumer-groups --describe --group my-group

# Offset группы
kafka-consumer-groups --describe --group my-group --offsets

Delivery Semantics

Семантика Настройки Описание
At most once enable.auto.commit=true Могут быть потеряны сообщения
At least once enable.auto.commit=false Могут быть дубликаты
Exactly once enable.idempotence=true Каждое сообщение один раз