Базы данных
Шпаргалка по 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 | Каждое сообщение один раз |