ここから始めるには、関連するテーブルの簡略化されたバージョンがあります。
tbl_map
約 4,000,000 行あり、tbl_1
約 120 行あり、tbl_2
約 5,000,000 行が含まれています。Google や Yahoo! などがはるかに大きなデータセットを使用していることを考えると、データがそれほど大きくないと考えるべきではないことはわかっています。だから私は何かが欠けていると仮定しています。
CREATE TABLE `tbl_map` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`tbl_1_id` bigint(20) DEFAULT '-1',
`tbl_2_id` bigint(20) DEFAULT '-1',
`rating` decimal(3,3) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `tbl_1_id` (`tbl_1_id`),
KEY `tbl_2_id` (`tbl_2_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `tbl_1` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `tbl_2` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`data` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
対象のクエリ: また、 の代わりORDER BY RAND()
にORDERY BY t.id DESC
. クエリは 5 ~ 10 秒ほどかかり、ユーザーがこのページを表示するときにかなりの待ち時間が発生します。
EXPLAIN SELECT t.data, t.id , tm.rating
FROM tbl_2 AS t
JOIN tbl_map AS tm
ON t.id = tm.tbl_2_id
WHERE tm.tbl_1_id =94
AND tm.rating IS NOT NULL
ORDER BY t.id DESC
LIMIT 200
1 SIMPLE tm ref tbl_1_id, tbl_2_id tbl_1_id 9 const 703438 Using where; Using temporary; Using filesort
1 SIMPLE t eq_ref PRIMARY PRIMARY 8 tm.tbl_2_id 1
クエリを高速化したい、適切なインデックスがあることを確認したいなどです。DB Gurus からのアドバイスに感謝します! ありがとう。