---
title: 0. Основы и запросы
description: 
published: true
date: 2025-05-15T20:02:37.600Z
tags: clickhouse
editor: markdown
dateCreated: 2025-05-15T20:01:45.285Z
---

## Структура кластера

### Найдено на просторах инета:
##### Выбор решения:
- Если **диск загружен на запись (INSERT)** → **шардирование (Distributed)**.  
- Если **диск загружен на чтение (SELECT)** → **репликация (Replicated)**.  
- Если **один сервер, но много дисков** → **JBOD или RAID 0/10**.  

#### Реализуем такую структуру тестового кластера:
- сервер clickhouse-1
- сервер clickhouse-2
- сервер clickhouse-keeper
Для того, чтобы это было надежно и работало быстро с записью в БД, необходимо сделать репликацию (Replicated) таблиц и распределенный (Distributed) доступ к таблицам.
Если делать несколько шардов (shard) в настройках кластера, то это значит, что часть данных будет находится на одном сервере, другая часть на другом. При выходе из строя сервера мы потеряем всю базу.
Поэтому настраиваем shard1 на обоих серверах, а также  replica1  и replica2 для дублирования данных на серверах.

### Репликация поддерживается только для таблиц семейства MergeTree:
https://clickhouse.com/docs/ru/engines/table-engines/mergetree-family/replication
- ReplicatedMergeTree
- ReplicatedSummingMergeTree
- ReplicatedReplacingMergeTree
- ReplicatedAggregatingMergeTree
- ReplicatedCollapsingMergeTree
- ReplicatedVersionedCollapsingMergeTree
- ReplicatedGraphiteMergeTree

### Для одиночного сервера и кластера
#### Получение списка всех баз данных на сервере
```sql
SHOW DATABASES;
```
#### Просмотр всех таблиц в конкретной базе default
```sql
SHOW TABLES FROM default;
```
#### Получить запрос на создание таблицы из существующей
```sql
show create table default.event;
```
#### Создание базы данных
```sql
CREATE DATABASE IF NOT EXISTS my_database ENGINE = Atomic;
```
Создает новую базу данных с именем `my_database`. Если такая база уже существует, ничего не произойдет благодаря условию `IF NOT EXISTS`.
Параметр `ENGINE = Atomic` используется для новых версий ClickHouse и позволяет создавать транзакционно безопасные базы данных. В ранних версиях использовался простой синтаксис без указания движка.
#### Создание таблицы
```sql
CREATE TABLE my_table (
    event_date Date,
    user_id UInt32,
    page_views Int32,
    revenue Float64
)
ENGINE = MergeTree()
ORDER BY (event_date);
```
##### Вставка данных
```sql
INSERT INTO my_table VALUES ('2023-08-01', 1, 10, 100.5), ('2023-08-02', 2, 15, 150.75);
```
##### Выборка данных
```sql
SELECT * FROM my_table WHERE event_date >= '2023-08-01' AND event_date <= '2023-08-31';
```
#### Показ структуры таблицы
```sql
DESCRIBE TABLE my_database.my_table;
```
или подробнее:
```sql
SELECT * FROM system.columns WHERE table='my_table' AND database='my_database';
```
### Узнать сколько занимают места базы
```sql
SELECT 
    database,
    formatReadableSize(sum(bytes_on_disk)) AS total_size
FROM system.parts
WHERE active
GROUP BY database
ORDER BY sum(bytes_on_disk) DESC;
```
#### Узнать сколько занимают места таблицы в базе
default
```sql
SELECT
    name AS table_name,
    formatReadableSize(total_bytes) AS size_readable,
    total_rows AS rows_count
FROM system.tables
WHERE database = 'default'
ORDER BY total_bytes DESC;
```
system
```sql
SELECT
    name AS table_name,
    formatReadableSize(total_bytes) AS size_readable,
    total_rows AS rows_count
FROM system.tables
WHERE database = 'system'
ORDER BY total_bytes DESC;
```
#### Очистка базы event_replicated
```sql
TRUNCATE TABLE default.event_replicated;
```
#### Очистка старых данных от определенной даты
```sql
ALTER TABLE my_table DELETE WHERE event_date < '2023-08-01';
```
#### Безопасное удаление таблицы
```sql
DROP TABLE IF EXISTS my_database.my_table;
```
Безопасно удаляет указанную таблицу, если она существует.


### Для кластера

#### Вывести список серверов в кластере 
```sql
SELECT hostName() FROM clusterAllReplicas('smvu2_cluster', 'system', 'one')
```
#### Получение списка Replicated таблиц
```sql
SELECT 
    database,
    name AS table,
    engine
FROM system.tables
WHERE engine LIKE 'Replicated%';
```
#### Получение списка Distributed таблиц
```sql
SELECT
    database,
    name AS table,
    engine
FROM system.tables
WHERE engine LIKE 'Distributed%';
```
#### Проверить распределение данных базы event на серверах кластера
```sql
SELECT 
    hostName() AS host,
    count() AS count
FROM clusterAllReplicas(smvu2_cluster, default.event)
GROUP BY host;
```
#### Удалить таблицу в кластере
```sql
DROP TABLE event_replicated ON CLUSTER smvu2_cluster SYNC;
```