Моя работа в настоящее время использует MySQL (MyISAM) исключительно для хранения всех данных. В настоящее время у нас более 300 веб-серверов и около 150 баз данных. К сожалению, я в состоянии написать структуру таблицы для поддержки более 100 миллионов строк за 30-дневный период. Идея такова:
- Вставки большого объема (без обновлений или удалений и всегда в конце таблицы)
- 1 строка выбирает
- Данные старше 30 дней удаляются
Лучшее решение, по-видимому, состоит в том, чтобы иметь таблицу на каждый день, объединенную в таблицу слияния для выбранных. Действительно будут повторяющиеся данные, но SELECT вытянет только самую последнюю строку на основе временной метки и поля int. Очевидно, что иметь 30 столов не идеально, но жизнь идет своим чередом.
Есть ли в этом подходе недостатки? Есть ли какие-либо другие способы приблизиться к этому, которые мне не хватает (мы застряли на 5.0)? Будет ли блокировка таблицы большой проблемой при выполнении ALTER TABLE для таблицы слияния, когда создается таблица нового дня? В настоящее время у нас есть структура ротации таблиц, но если мы перейдем к одной таблице, которая должна выбирать данные, которые мы хотим, из старой таблицы в новую, это будет довольно медленно, поскольку она приближается к 100 миллионам строк.
Существуют и другие технологии для элегантного выполнения этой задачи, но наш отдел продаж уже продал решение, и у нас нет времени на роскошь.
Мы будем признательны за любой вклад.
Структура:
CREATE TABLE `merge_test_1` (
`date_stamp` long NOT NULL,
`hash` char(32) NOT NULL,
`p_id` mediumint(8) unsigned NOT NULL,
`a_id` mediumint(8) unsigned NOT NULL,
`b_id` mediumint(8) unsigned NOT NULL,
PRIMARY KEY (`hash`,`p_id`,`date_stamp`)
) ENGINE=MyISAM
Пример запроса
SELECT b_id,a_id FROM merge_test WHERE hash='1' AND p_id=1
ORDER BY date_stamp DESC LIMIT 1