次のデータベース テーブルを検討してください。
- 13,000,000 行 (メッセージごとに 1 行) のテーブル「メッセージ」。
- 3,000,000 行 (ユーザーごとに 1 行) のテーブル "users"。
次のクエリは、一連のメッセージと対応するユーザーを取得するために使用されます。
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 でインデックス化されます。
「users」は id でインデックス化されます (主キー、INT 自動生成)。
データベースは MyISAM を使用した MySQL です。
現在、「メッセージ」は「id」でインデックス化されているため、クエリの実行には3000ミリ秒以上かかるため、正しい行を取得するのは非常に迅速です。
私の質問は次のとおりです:記述シナリオとセットアップを考えると、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」がINTではなくBIGINTであることです。それがヒントになりませんか?