Когда база данных упирается в дисковые ограничения, а ресурсы сервера нельзя расширить, можно применить несколько стратегий для немедленного улучшения производительности.
# Для MySQL/MariaDB
SET GLOBAL innodb_buffer_pool_size = (SELECT @@innodb_buffer_pool_size * 0.7);
SET GLOBAL query_cache_size = 64M;
# Для PostgreSQL
ALTER SYSTEM SET random_page_cost = 1.5;
ALTER SYSTEM SET effective_io_concurrency = 200;
# MySQL
pt-query-digest /var/log/mysql/mysql-slow.log
# PostgreSQL
pg_stat_statements
# Для MySQL
SET GLOBAL max_connections = 50;
SET GLOBAL long_query_time = 2;
-- Создание материализованных представлений
CREATE MATERIALIZED VIEW fast_customer_data AS
SELECT * FROM customers JOIN orders USING(customer_id);
-- Анализ использования индексов
EXPLAIN ANALYZE SELECT * FROM large_table WHERE condition;
-- Создание покрывающих индексов
CREATE INDEX idx_covering ON table(columns) INCLUDE(other_columns);
-- Перенос архивных данных в отдельную таблицу
CREATE TABLE orders_archive AS
SELECT * FROM orders WHERE date < '2020-01-01';
# Для PostgreSQL
CREATE TABLESPACE fastspace LOCATION '/mnt/ssd';
ALTER TABLE critical_table SET TABLESPACE fastspace;
dd if=/dev/zero of=/swapfile bs=1G count=8
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
-- Уменьшение уровня изоляции
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
Анализ текущей нагрузки:
iostat -x 1 # Мониторинг дисковых операций
Оптимизация конфигурации:
Оптимизация запросов:
Реорганизация данных:
Экстренные меры:
Команда | Назначение |
---|---|
vmstat 1 | Общая нагрузка на систему |
iotop -o | Процессы с дисковыми операциями |
pg_top / mytop | Мониторинг активности СУБД |
pt-index-usage | Анализ использования индексов |
Резюмируем: при ограниченных ресурсах сервера фокус должен быть на уменьшении дисковых операций через кэширование, оптимизацию запросов и реорганизацию данных. Комбинация этих методов может дать значительный прирост производительности без аппаратного апгрейда.