У меня есть таблица с использованием InnoDB, в которой хранятся все сообщения, отправленные моей системой. В настоящее время таблица имеет 40 миллионов строк и растет на 3/4 миллиона в месяц.
Мой запрос в основном состоит в том, чтобы выбрать сообщения, отправленные пользователем и в пределах диапазона данных. Вот упрощенная таблица создания:
CREATE TABLE `log` (
`id` int(10) NOT NULL DEFAULT '0',
`type` varchar(10) NOT NULL DEFAULT '',
`timeLogged` int(11) NOT NULL DEFAULT '0',
`orig` varchar(128) NOT NULL DEFAULT '',
`rcpt` varchar(128) NOT NULL DEFAULT '',
`user` int(10) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `timeLogged` (`timeLogged`),
KEY `user` (`user`),
KEY `user_timeLogged` (`user`,`timeLogged`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Примечание: у меня тоже есть отдельные индексы из-за других запросов.
Запрос выглядит так:
SELECT COUNT(*) FROM log WHERE timeLogged BETWEEN 1282878000 AND 1382878000 AND user = 20
Проблема в том, что этот запрос занимает от 2 минут до 10 минут, в зависимости от нагрузки на пользователя и сервер, что является слишком большим временем ожидания загрузки страницы. У меня включен кеш mysql и кеш в приложении, но проблема в том, что когда пользователь ищет новые диапазоны, он не попадет в кеш.
Мой вопрос:
- Изменится ли изменение индекса user_timeLogged?
- Это проблема с MySQL и большими базами данных? Я имею в виду, Oracle или другие БД также страдают от этой проблемы?
AFAIK, мои индексы созданы правильно, и этот запрос не должен занимать так много времени.
Спасибо всем, кто помогает!