考虑以下数据库表:
- 包含 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 条消息。
“消息”在 id(主键,BIGINT不是自动生成)和 user_id 上建立索引。
“用户”在 id 上建立索引(主键,INT 自动生成)。
数据库是使用 MyISAM 的 MySQL。
目前,查询的执行时间超过 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。这可能是一个暗示吗?