Рассмотрим следующие таблицы базы данных:
- Таблица «сообщения» с 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. Может это намек?