Недавно столкнулся со странной штукой. Резкий рост времени выполнения запроса по одной определенной таблице и огромная нагрузка на CPU. Вы сейчас скажите, индексы проморгал, не тут-то было.
По факту:
10.1.21-MariaDB
Трафик 8 ГиБ/час
Под БД выделяем ~200 Гб RAM
4xSSD 800Gb RAID 10
Размер БД 150 Гб
Таблицы InnoDB
Проблемная таблица:
Размер: 20 Гб. и ~ 120 млн. строк (12 ГиБ данных и 9.2 ГиБ индекса)
* на данный момент
CREATE TABLE data_table (
id bigint(14) UNSIGNED NOT NULL AUTO_INCREMENT,
id_out_data bigint(20) UNSIGNED NOT NULL,
id_out_link int(11) UNSIGNED NOT NULL,
type enum ('type1', 'type2') NOT NULL,
link varchar(256) DEFAULT NULL,
date_upd datetime NOT NULL,
date_add datetime NOT NULL,
PRIMARY KEY (id),
INDEX id_out_link(id_out_link, date_add),
UNIQUE INDEX udx_id_out_data (id_out_data)
)
ENGINE = INNODB;
Оптимизация не помогает.
Чтобы исправить ситуацию приходится чистить таблицу(удалять данные в ущерб проекту), после чистки нагрузка спадает почти до нулевой. Причем ни кол-во запросов, ни трафик - не меняются, и даже на оборот, возрастают. (т.к. сервер начинает быстрее обрабатывать запросы)
Скрин нагрузки на машину: http://joxi.ru/l2ZxW06t9kBQrJ
Со временем, этот безобидный запрос начинает вешать БД:
SELECT * FROM `data_table` WHERE `id_out_link` = '4584858094' LIMIT 50;
Индекс пробовал менять вместо id_out_link, date_add на id_out_link . Безрезультатно.
Заметил, чем больше общий объем БД, тем чаще приходится чистить таблицу data_table . Не далек тот день, когда чистка этой таблицы уже не будет помогать и придется чистить всю БД
На этом мои идеи кончились. Надеюсь вы мне поможете.