Рассмотрим следующие таблицы базы данных:
- Таблица "сообщений" с 13 000 000 строк (одна строка для каждого сообщения).
- Таблица "пользователи" с 3 000 000 строк (одна строка для каждого пользователя).
Следующий запрос используется для извлечения нескольких сообщений и соответствующих пользователей:
SELECT messages.id, messages.message, users.id, users.username
FROM messages
INNER JOIN users ON messages.user_id=users.id
WHERE messages.id in (?, ?, ?, ? ... a total of 100 "?":s);
В каждом запросе выбирается 100 сообщений.
"сообщения" индексируются по идентификатору (первичный ключ, BIGINT не автогенерируется) и user_id.
"пользователи" индексируются по идентификатору (первичный ключ, автоматически сгенерированный INT).
База данных - это MySQL, использующий MyISAM.
В настоящее время для выполнения запроса требуется более 3000 мс, что вызывает у меня проблемы, поскольку "сообщения" индексируются на "id", поэтому получение правильных строк должно быть очень быстрым.
Мой вопрос: учитывая описанный сценарий и настройку, время запроса 3000 мс "нормально" или я что-то упускаю? Пожалуйста, дайте мне знать, если потребуется дополнительная информация.
Обновление # 1: Ниже приведены определения таблиц:
CREATE TABLE messages (
id bigint(20) NOT NULL DEFAULT '0',
user_id int(11) NOT NULL DEFAULT '0',
message varchar(160) NOT NULL DEFAULT '',
PRIMARY KEY (id),
KEY user_id (user_id),
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE users (
id int(11) NOT NULL DEFAULT '0',
username varchar(32) NOT NULL DEFAULT '',
PRIMARY KEY (id),
UNIQUE KEY username (username),
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Единственная "нестандартная" вещь, которую я наблюдаю в определениях, заключается в том, что "messages.id" - это BIGINT, а не INT. Может быть, это намек?