Рассмотрим следующую таблицу:MySQL Partitioning: SELECT по идентификатору, но УДАЛИТЬ по дате
CREATE TABLE `event` (
`uid` bigint(13) NOT NULL,
`time` bigint(14) NOT NULL,
`type` smallint(5) NOT NULL,
`msg` varchar(2048) DEFAULT NULL,
KEY `uid` (`uid`),
KEY `time` (`time`),
KEY `time_type_uid` (`time`,`type`,`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Что я в принципе сделать:
INSERT
~ 1 миллион строк в день, текущий размер составляет около 100 миллион записейDELETE
все строки старше 100 дней:- Заявление # 1:
DELETE FROM event WHERE
time
< unix_timestamp() - 100 * 86400; - Ведомость № 2:
DELETE FROM event WHERE
time
< unix_timestamp() - 100 * 86400 LIMIT 1000;
- Заявление # 1:
- Пользователи будут
SELECT
все события по UID, около 500 запросов в день в сумме, так не то, что довольно много:- Заявление # 1:
SELECT * FROM event WHERE
uid
= 4711 Иtype
В (23,1002,12, 1); - Ведомость № 2:
SELECT * FROM event WHERE
uid
= 4711 Иtype
IN (23,1002,12,1) Иtime
BETWEEN 1381051061 AND 1381051861;
- Заявление # 1:
Обработка этой таблицы стали довольно медленно, особенно после DELETE
блоков заданий INSERT
с/SELECT
сек на столе. Мы пробовали ежедневный объем DELETE
, как объяснялось выше (Statement # 1), который больше не работает без блокировки таблицы. В настоящее время мы удаляем каждые 30 секунд (Statement # 2), но это будет блокироваться в течение 10 секунд.
Мы планируем увеличить нагрузку INSERT
, но первые тесты приводят к зависанию резьбы в состоянии «Системный блок», я думаю, это связано с I/O. Настройки сервера оптимизируются, как предложено mysqltuner.pl. Аппаратная система имеет определенные проблемы ввода-вывода и «как есть», к сожалению, она не может быть изменена по нескольким причинам. У нас даже нет доступа root.
Является ли разделение даже решением и является MyISAM лучшим двигателем для использования? Перед улучшением аппаратного обеспечения нам необходимо оптимизировать все, что угодно.
Голосование, чтобы закрыть: слишком широко. Увлекательная проблема, но слишком широкая для окончательного ответа здесь, и, возможно, не проблема программирования. Мы можем рассказать вам, как разделять, но мы не можем оптимизировать абстрактные. Почему не InnoDB? Каковы настройки сервера? Что такое системные спецификации и загрузка? Какие еще запросы выполняются? Как часто вы удаляете, и может ли это быть более частым? У вас есть правильные индексы для вашего шаблона запроса? (Мое предположение, не совсем.) И т.д. – pilcrow
Спасибо за ваши комментарии. Я знаю, что сложно дать советы по оптимизации для широкой проблемы. Я полагал, что обработка данных, подобных этому, может быть общей проблемой. Я добавил несколько подробностей, надеюсь, что это поможет. –
dba.stackexchange может быть лучшим местом, чтобы спросить, какие виды оптимизации подходят и как вы оцениваете их эффективность. – pilcrow