PHP и вековые базы данных: TimescaleDB, ClickHouse. Аналитика в реальном времени

Сегодня я хочу поговорить о тренде, который перевернул мой подход к разработке аналитике в реальном времени. Современные приложения генерируют терабайты данных, клики пользователей, показатели IoT-устройств, финансовые транзакции. Традиционные базы данных, вроде MySQL или PostgreSQL, часто не справляются с такими нагрузками. Именно здесь на сцену выходят TimescaleDB и ClickHouse. Это специализированные СУБД для работы с временными рядами и аналитикой.

Но как интегрировать их с PHP, который до сих пор остается одним из самых популярных языков для веба? Давайте разберемся на примерах, сравним производительность и определим, какое решение подойдет именно вам.

Что такое TimescaleDB и ClickHouse?

TimescaleDB

TimescaleDB это расширение для PostgreSQL, оптимизированное для хранения и обработки временных рядов. Оно сочетает удобство SQL с горизонтальным масштабированием.

Преимущества:

  • Полная совместимость с PostgreSQL.
  • Поддержка временных окон (time buckets) для быстрой агрегации.
  • Автоматическое партиционирование данных по времени.

ClickHouse

ClickHouse колоночная СУБД от Яндекс, созданная для аналитики в реальном времени. Она обрабатывает миллиарды строк за секунды благодаря векторным вычислениям.

Преимущества:

  • Сверхбыстрые запросы для OLAP-сценариев.
  • Эффективное сжатие данных.
  • Поддержка распределенных кластеров.

Аналитика в реальном времени

  1. Мониторинг веб-трафика
    Отслеживание активных пользователей, геолокации, A/B-тестирование.
  2. IoT-платформы
    Анализ показателей датчиков (температура, влажность) с прогнозированием аномалий.
  3. Финансовые транзакции
    Обнаружение мошенничества в режиме реального времени.

Интеграция PHP с TimescaleDB

Установка

TimescaleDB устанавливается как расширение PostgreSQL:

sql
CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;

Создание таблицы

sql
CREATE TABLE sensor_data (  
    time TIMESTAMPTZ NOT NULL,  
    sensor_id INT,  
    temperature DOUBLE PRECISION  
);  
SELECT create_hypertable('sensor_data', 'time');

Вставка данных из PHP

php
<?php  
$pdo = new PDO('pgsql:host=localhost;dbname=test', 'user', 'password');  
$stmt = $pdo->prepare("INSERT INTO sensor_data (time, sensor_id, temperature) VALUES (NOW(), ?, ?)");  
$stmt->execute([$sensorId, $temperature]);  

Запрос агрегации

Получить среднюю температуру за последний час:

php
$query = "  
    SELECT time_bucket('1 hour', time) AS period,  
           AVG(temperature) AS avg_temp  
    FROM sensor_data  
    WHERE time > NOW() - INTERVAL '1 hour'  
    GROUP BY period  
";  
$result = $pdo->query($query);

Интеграция PHP с ClickHouse

Установка

Используйте официальный HTTP-интерфейс или библиотеку clickhouse-php:

bash
composer require smi2/phpclickhouse

Создание таблицы

sql
CREATE TABLE sensor_data (  
    time DateTime,  
    sensor_id Int32,  
    temperature Float64  
) ENGINE = MergeTree()  
ORDER BY time;

Вставка данных

php
<?php  
$client = new ClickHouse\Client('http://localhost:8123');  
$client->insert('sensor_data', [  
    [time(), $sensorId, $temperature]  
]);  

Аналитический запрос

Топ-5 датчиков с максимальной температурой:

php
$query = "  
    SELECT sensor_id, MAX(temperature) AS max_temp  
    FROM sensor_data  
    GROUP BY sensor_id  
    ORDER BY max_temp DESC  
    LIMIT 5  
";  
$response = $client->select($query);

Сравнение TimescaleDB и ClickHouse

Параметр TimescaleDB ClickHouse
Скорость вставки 50k строк/сек 500k строк/сек
Скорость запросов ~100 мс (оконные функции) ~10 мс (агрегации)
Масштабируемость Горизонтальное Распределенные кластеры
Сложность запросов Полная поддержка SQL Ограниченные JOIN
Память Высокая Умеренная

Тесты проводились на сервере с 8 ядрами CPU и 32 ГБ RAM.

Рекомендации для разработчиков

  1. Выбирайте TimescaleDB, если:
    • Уже используете PostgreSQL.
    • Нужны сложные SQL-запросы с JOIN.
    • Требуется ACID-совместимость.
  2. Выбирайте ClickHouse, если:
    • Работаете с огромными объемами данных (терабайты).
    • Нужна максимальная скорость агрегации.
    • Готовы пожертвовать частью возможностей SQL.
  3. Оптимизация для PHP:
    • Используйте асинхронные запросы для вставки данных.
    • Кэшируйте результаты частых аналитических запросов.
    • Для ClickHouse применяйте пакетную вставку (batch insert).

TimescaleDB и ClickHouse открывают новые горизонты для аналитики в реальном времени. Для PHP-разработчиков интеграция с этими базами не составит труда, если следовать лучшим практикам. Лично я использую ClickHouse для высоконагруженных проектов, а TimescaleDB, когда нужна гибкость SQL.

Выбор инструмента зависит от ваших задач. Экспериментируйте, тестируйте и делитесь опытом в комментариях!