次のテーブルがあります(無関係なものは削除されています):
create table Payment (
id int not null auto_increment,
status int not null,
primary key(id)
);
create table Booking (
id int not null auto_increment,
paymentId int not null,
nrOfPassengers int not null,
primary key(id),
key paymentFK (paymentId),
constraint paymentFK foreign key (paymentId) references Payment(id)
);
Booking
~456k 行をPayment
含み、~331k 行を含みます。次のクエリは 0.06 秒かかり、97 行を返します。
select * from Booking b
join Payment p on b.paymentId = p.id
where p.status = 3
句を追加するorder by
と、代わりにクエリに 4.4 秒かかり、ほぼ 100 倍遅くなります。
select * from Booking b
join Payment p on b.paymentId = p.id
where p.status = 3
order by b.nrOfPassengers
最初のクエリの EXPLAIN:
id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
1, SIMPLE, p, ALL, PRIMARY, NULL, NULL, NULL, 331299, Using where
1, SIMPLE, b, ref, paymentFK, paymentFK, 9, p.id, 1, Using where
そして2番目:
id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
1, SIMPLE, p, ALL, PRIMARY, NULL, NULL, NULL, 331299, Using where; Using temporary; Using filesort
1, SIMPLE, b, ref, paymentFK, paymentFK, 9, p.id, 1, Using where
MySQL 5.1.34 を使用しています。
where
クエリで使用される句は、 からの大部分の行を除外しますPayment
。(非常に選択的な)where
句でフィルタリングする前に、MySQL が結果セットをソートするという印象を受けます。私はこれで正しいですか?もしそうなら、なぜそれはこれをするのですか?両方のテーブルを分析してみましたが、クエリ プランに変更はありません。