Руководство по оптимизации производительности

Guides
Последнее обновление: 16 февраля 2026 г.

Добро пожаловать в руководство по оптимизации производительности HarborDB. Этот всеобъемлющий ресурс поможет вам оптимизировать каждый аспект вашего рабочего процесса PostgreSQL, от написания эффективных запросов до настройки HarborDB и macOS для максимальной производительности.

Понимание факторов производительности

На производительность вашей базы данных в HarborDB влияют несколько факторов:

| Фактор | Влияние | Уровень оптимизации | | ---------------------------- | ----------- | ------------------- | | Дизайн запросов | Высокое | Приложение | | Индексы базы данных | Высокое | База данных | | Сетевое подключение | Среднее | Инфраструктура | | Системные ресурсы | Среднее | macOS | | Настройки HarborDB | Низкое-Среднее | Приложение | | Конфигурация PostgreSQL | Высокое | База данных |

Оптимизация запросов

Написание эффективных запросов

1. Выбирайте только то, что нужно

-- ❌ Неэффективно
SELECT * FROM customers;

-- ✅ Эффективно
SELECT customer_id, name, email FROM customers;

2. Эффективное использование условий WHERE

-- ❌ Неэффективно (полное сканирование таблицы)
SELECT * FROM orders
WHERE EXTRACT(YEAR FROM order_date) = 2024;

-- ✅ Эффективно (использует индекс)
SELECT * FROM orders
WHERE order_date >= '2024-01-01'
  AND order_date < '2025-01-01';

3. Ограничение наборов результатов

-- Всегда ограничивайте при исследовании
SELECT * FROM large_table LIMIT 100;

-- Используйте пагинацию для больших результатов
SELECT * FROM products
ORDER BY created_at DESC
LIMIT 50 OFFSET 0;

4. Избегайте проблем N+1 запросов

-- ❌ Неэффективно (несколько запросов)
-- Первый запрос: SELECT * FROM orders WHERE status = 'pending'
-- Затем для каждого заказа: SELECT * FROM customers WHERE customer_id = ?

-- ✅ Эффективно (один запрос с JOIN)
SELECT o.*, c.name, c.email
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
WHERE o.status = 'pending';

Использование EXPLAIN для анализа запросов

HarborDB упрощает анализ производительности запросов:

  1. Напишите запрос в редакторе
  2. Нажмите "Explain" (⚡) на панели инструментов
  3. Просмотрите план выполнения в панели результатов

Понимание вывода EXPLAIN

  • Seq Scan: Полное сканирование таблицы (часто медленно для больших таблиц)
  • Index Scan: Использование индекса (обычно быстрее)
  • Nested Loop: Объединение таблиц (проверьте, уместно ли это)
  • Оценки стоимости: Более высокие числа означают больше работы

Распространённые шаблоны оптимизации

-- Предложение добавления отсутствующего индекса
EXPLAIN ANALYZE
SELECT * FROM orders WHERE customer_id = 1234;

-- Результат может показать: "Seq Scan on orders"
-- Решение: CREATE INDEX idx_orders_customer_id ON orders(customer_id);

Оптимизация индексов базы данных

Когда добавлять индексы

Добавляйте индексы для:

  • Первичных ключей (автоматически индексируются)
  • Внешних ключей (часто требуют ручного индексирования)
  • Часто фильтруемых столбцов
  • Часто сортируемых столбцов
  • Столбцов, используемых в условиях JOIN

Создание эффективных индексов

-- Индекс одного столбца
CREATE INDEX idx_orders_status ON orders(status);

-- Многоколоночный индекс (порядок имеет значение!)
CREATE INDEX idx_orders_date_status ON orders(order_date, status);

-- Частичный индекс (для определённых подмножеств)
CREATE INDEX idx_active_users ON users(email) WHERE active = true;

-- Уникальный индекс для ограничения
CREATE UNIQUE INDEX idx_unique_email ON users(email);

Обслуживание индексов

-- Проверка использования индексов
SELECT schemaname, tablename, indexname
FROM pg_stat_user_indexes
WHERE idx_scan = 0;  -- Никогда не используемые индексы

-- Перестроение фрагментированных индексов
REINDEX INDEX idx_orders_status;

-- Обновление статистики для планировщика запросов
ANALYZE orders;

Оптимизация подключений

Настройки пула подключений

Оптимизируйте подключения HarborDB:

  1. Откройте НастройкиПодключения
  2. Настройте параметры в соответствии с вашим рабочим процессом:

| Параметр | Рекомендуемое значение | Назначение | | ----------------------- | ---------------------- | ------------------------------ | | Таймаут подключения | 30 секунд | Предотвращение зависания подключений | | Keep-Alive | Включено | Поддержание неактивных подключений | | Макс. подключений | 5-10 | Баланс производительности/памяти | | Режим SSL | Prefer | Безопасно без излишней нагрузки |

Сетевая оптимизация

Для удалённых баз данных:

  1. Используйте SSH1-туннелирование для безопасных оптимизированных подключений
  2. Включите сжатие для больших наборов результатов
  3. Планируйте тяжёлые запросы в непиковые часы
  4. Мониторьте задержку сети с помощью встроенных инструментов
-- Тестирование задержки сети
SELECT 1 as test;  -- Простой запрос для измерения времени кругового пути

Настройки производительности HarborDB

Управление памятью

Настройте использование памяти в НастройкиПроизводительность:

| Параметр | Рекомендация | Влияние | | ---------------------- | ------------ | ------------------------------ | | Кэш запросов | 256 МБ | Более быстрые повторные запросы | | Память для наборов результатов | 512 МБ | Обработка больших наборов данных | | Режим потоковой передачи | Включено | Лучше для больших результатов | | Автообновление | 30 секунд | Баланс актуальности/производительности |

Оптимизация интерфейса

  1. Отключите анимацию в Настройки → Внешний вид
  2. Уменьшите задержку автодополнения до 100 мс
  3. Ограничьте глубину авторазворачивания боковой панели
  4. Используйте тёмный режим для эффективности OLED-дисплеев

Сочетания клавиш для скорости

Освойте эти усилители продуктивности:

| Сочетание клавиш | Действие | Сэкономленное время | | ---------------- | ---------------- | ------------------- | | ⌘ + R | Выполнить запрос | 2-3 секунды | | ⌘ + . | Отменить запрос | Предотвращает ожидание | | ⌘ + T | Новая вкладка запроса | 1-2 секунды | | ⌘ + S | Сохранить запрос | 1 секунда | | ⌘ + E | Экспортировать результаты | 2 секунды | | ⌘ + F | Найти в запросе | 3-5 секунд |

Системная оптимизация macOS

Соображения по оборудованию

Память (ОЗУ)

  • Минимум: 8 ГБ для базового использования
  • Рекомендуется: 16 ГБ для профессиональной работы
  • Оптимально: 32 ГБ для больших наборов данных

Хранилище (SSD)

  • Минимум: 256 ГБ свободного места
  • Рекомендуется: 512 ГБ+ для файлов базы данных и экспорта
  • Используйте внешний SSD для хранения больших баз данных

Процессор

  • Apple Silicon: Оптимизировано для M1/M2/M3
  • Intel: i5 минимум, рекомендуется i7/i9

Настройки macOS

  1. Экономия энергии (Системные настройки):

    • Отключите "Переводить жёсткие диски в режим сна"
    • Не выключайте дисплей во время длительных запросов
  2. Мониторинг системы:

    • Мониторьте использование памяти HarborDB
    • Проверяйте ресурсы процесса PostgreSQL
  3. Дисковая утилита:

    • Убедитесь, что TRIM SSD включён
    • Мониторьте здоровье диска и свободное место

Команды производительности в Терминале

# Проверка системных ресурсов
top -o cpu  # Использование CPU
vm_stat     # Использование памяти
iostat      # Ввод-вывод на диск

# Мониторинг HarborDB
ps aux | grep HarborDB
lsof -p $(pgrep HarborDB) | wc -l  # Открытые файлы

Стратегии работы с большими наборами данных

Работа с миллионами строк

1. Пагинация на стороне сервера

-- Вместо загрузки всех строк
SELECT * FROM huge_table;

-- Используйте пагинацию
SELECT * FROM huge_table
ORDER BY id
LIMIT 1000 OFFSET 0;

-- Следующая страница
SELECT * FROM huge_table
ORDER BY id
LIMIT 1000 OFFSET 1000;

2. Потоковая передача результатов

Включите в НастройкиПроизводительность:

  • ✅ "Включить потоковую передачу для результатов > 10 000 строк"
  • ✅ "Размер части потоковой передачи: 1000 строк"
  • ✅ "Фоновая потоковая передача: Включена"

3. Материализованные представления

-- Предварительное вычисление дорогих запросов
CREATE MATERIALIZED VIEW daily_sales_summary AS
SELECT
    DATE(order_date) as day,
    COUNT(*) as orders,
    SUM(total) as revenue
FROM orders
GROUP BY DATE(order_date);

-- Периодическое обновление
REFRESH MATERIALIZED VIEW daily_sales_summary;

Оптимизация экспорта

Для больших экспортов:

  1. Экспортируйте в CSV (эффективнее, чем JSON)
  2. Используйте экспорт частями (Настройки → Экспорт)
  3. Сжимайте экспорты автоматически
  4. Экспортируйте напрямую на внешнее хранилище

Мониторинг производительности

Встроенные инструменты HarborDB

  1. Таймер запросов: Показывает время выполнения в строке состояния
  2. Монитор памяти: Просмотр в Окно → Монитор производительности
  3. Статус подключения: Показатели сети в реальном времени
  4. История запросов: Обзор производительности прошлых запросов

Запросы мониторинга PostgreSQL

-- Активные запросы
SELECT
    pid,
    usename,
    query_start,
    state,
    query
FROM pg_stat_activity
WHERE state != 'idle'
ORDER BY query_start DESC;

-- Медленные запросы
SELECT
    query,
    calls,
    total_time,
    mean_time,
    rows
FROM pg_stat_statements
ORDER BY mean_time DESC
LIMIT 10;

-- Статистика таблиц
SELECT
    schemaname,
    relname,
    seq_scan,
    idx_scan,
    n_tup_ins,
    n_tup_upd,
    n_tup_del
FROM pg_stat_user_tables
ORDER BY seq_scan DESC;

Распространённые проблемы производительности и решения

Проблема: "Запрос выполняется слишком долго"

Чек-лист решения:

  1. [ ] Добавьте соответствующие индексы
  2. [ ] Перепишите запрос для большей эффективности
  3. [ ] Проверьте конфигурацию PostgreSQL
  4. [ ] Проверьте сетевое подключение
  5. [ ] Увеличьте настройки таймаута, если необходимо

Проблема: "HarborDB использует слишком много памяти"

Шаги решения:

  1. Уменьшите размер кэша запросов (Настройки → Производительность)
  2. Закройте неиспользуемые вкладки запросов
  3. Периодически перезапускайте HarborDB
  4. Проверьте на утечки памяти (Мониторинг системы)
  5. Увеличьте системную ОЗУ, если постоянно достигаете пределов

Проблема: "Экспорт/импорт очень медленные"

Советы по оптимизации:

  1. Используйте формат CSV вместо JSON
  2. Отключите антивирусное сканирование целевой папки
  3. Экспортируйте на SSD вместо HDD
  4. Используйте родные инструменты PostgreSQL (pg_dump/pg_restore) для очень больших операций
  5. Разделите большие операции на меньшие пакеты

Проблема: "Интерфейс работает медленно"

Быстрые исправления:

  1. Отключите подсветку синтаксиса для очень больших запросов
  2. Уменьшите авторазворачивание боковой панели
  3. Используйте более простую тему интерфейса
  4. Закройте другие ресурсоёмкие приложения
  5. Перезапустите HarborDB и macOS

Продвинутые техники оптимизации

Партиционирование больших таблиц

-- Создание партиционированной таблицы
CREATE TABLE orders_partitioned (
    order_id BIGSERIAL,
    order_date DATE NOT NULL,
    customer_id INT,
    total DECIMAL(10,2)
) PARTITION BY RANGE (order_date);

-- Создание партиций
CREATE TABLE orders_2024_q1 PARTITION OF orders_partitioned
    FOR VALUES FROM ('2024-01-01') TO ('2024-04-01');

CREATE TABLE orders_2024_q2 PARTITION OF orders_partitioned
    FOR VALUES FROM ('2024-04-01') TO ('2024-07-01');

Подсказки плана запросов

-- Принудительное использование индекса (используйте осторожно)
SET enable_seqscan = off;

-- Временное увеличение рабочей памяти
SET work_mem = '64MB';

-- Использование конкретного метода объединения
SET enable_nestloop = off;
SET enable_hashjoin = on;

Пул подключений с PGBouncer

Для приложений с высокой конкуренцией:

  1. Установите PGBouncer (Homebrew: brew install pgbouncer)
  2. Настройте для пула транзакций
  3. Подключите HarborDB через PGBouncer
  4. Мониторьте статистику повторного использования подключений

Тестирование производительности

Создание эталонных запросов

-- Тестирование производительности запросов
EXPLAIN ANALYZE
SELECT * FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31'
  AND status = 'completed'
ORDER BY total DESC
LIMIT 100;

-- Сравнение с разными подходами
EXPLAIN ANALYZE
SELECT * FROM orders
WHERE status = 'completed'
  AND order_date >= '2024-01-01'
  AND order_date <= '2024-12-31'
ORDER BY total DESC
LIMIT 100;

Мониторинг со временем

Создайте таблицу журнала производительности:

CREATE TABLE query_performance_log (
    log_id SERIAL PRIMARY KEY,
    query_hash TEXT,
    execution_time_ms INTEGER,
    row_count INTEGER,
    timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    notes TEXT
);

-- Логирование медленных запросов
INSERT INTO query_performance_log
    (query_hash, execution_time_ms, row_count, notes)
SELECT
    md5(query),
    EXTRACT(MILLISECONDS FROM NOW() - query_start),
    result_rows,
    'Обнаружен медленный запрос'
FROM pg_stat_activity
WHERE state = 'active'
  AND NOW() - query_start > INTERVAL '5 seconds';

Резюме лучших практик

Ежедневный рабочий процесс

  1. Начинайте с EXPLAIN для новых сложных запросов
  2. Используйте LIMIT при исследовании данных
  3. Закрывайте неиспользуемые подключения
  4. Регулярно перезапускайте HarborDB (еженедельно)
  5. Мониторьте системные ресурсы во время тяжёлой работы

Еженедельное обслуживание

  1. Просматривайте журналы производительности запросов
  2. Проверяйте неиспользуемые индексы
  3. Обновляйте статистику PostgreSQL (ANALYZE)
  4. Очищайте временные файлы
  5. Резервируйте конфигурации производительности

Ежемесячный обзор

  1. Анализируйте шаблоны медленных запросов
  2. Рассмотрите партиционирование таблиц для роста
  3. Проверяйте потребности в оборудовании
  4. Обновляйте HarborDB и PostgreSQL
  5. Документируйте улучшения производительности

Получение помощи

Поддержка настройки производительности

Если вам нужна дополнительная помощь:

  1. Поделитесь планами запросов с нашей службой поддержки
  2. Экспортируйте журналы производительности (Настройки → Экспорт журналов)
  3. Включите системные характеристики (версия macOS, ОЗУ, хранилище)
  4. Опишите ваш рабочий процесс и типичные размеры наборов данных

Дополнительные ресурсы

Обратная связь

Помогите нам улучшить документацию