これは全体のクエリです...MySQLのクエリの最適化 - 内部クエリ
SELECT s.*, (SELECT url FROM show_medias WHERE show_id = s.id AND is_primary = 1) AS media_url
FROM (shows As s)
WHERE `s`.`id` IN (
SELECT DISTINCT st.show_id
FROM show_time_schedules AS sts
LEFT JOIN show_times AS st ON st.id = sts.show_time_id
WHERE sts.schedule_date BETWEEN CAST('2012-01-10' AS date) AND CAST('2012-01-14' AS date)
)
AND `s`.`is_active` = 1
ORDER BY s.name asc
もし...
SELECT url FROM show_medias WHERE show_id = s.id AND is_primary = 1
(0.0004 sec)
そして...
SELECT DISTINCT st.show_id
FROM show_time_schedules AS sts
LEFT JOIN show_times AS st ON st.id = sts.show_time_id
WHERE sts.schedule_date BETWEEN CAST('2012-01-10' AS date) AND CAST('2012-01-14' AS date)
(0.0061 sec)
が明らかにあります理由....
SELECT s.*, (inner query 1) AS media_url
FROM (shows As s)
WHERE `s`.`id` IN (inner query 2)
AND `s`.`is_active` = 1
ORDER BY s.name asc
は5.7245 sec
ですか?
は、あなたはいつもあなたはまた、あなたのクエリ若干異なる方法を書くことができますが、以下のことを試してみました?MySQLは、クエリ
でやっているものを見るためにEXPLAIN or EXPLAIN EXTENDEDを使用することができますEXTENDED
id select_type table type possible_keys key key_len ref rows filtered Extra
1 PRIMARY s ALL NULL NULL NULL NULL 151 100.00 Using where; Using filesort
3 DEPENDENT SUBQUERY sts ALL NULL NULL NULL NULL 26290 100.00 Using where; Using temporary
3 DEPENDENT SUBQUERY st eq_ref PRIMARY PRIMARY 4 bvcdb.sts.show_time_id 1 100.00 Using where
2 DEPENDENT SUBQUERY show_medias ALL NULL NULL NULL NULL 159 100.00 Using where
興味深いことに、あなたはあなたがあなたにウルでショーをしたいかどうかによって(INNER、LEFT)あなたの選択リストでサブクエリを実行するのではなく、show_medias.show_id = s.idでshow_mediasに参加していますか?私はそれを見ることに興味があるだろう。クエリのEXPLAINには何もありませんか? – dash
@dashこれまでのところ、あなたの助けを借りてくれてありがとう、 'EXPLAIN EXTENDED'を追加しました。あなたの提案されたクエリは、6.x秒のパフォーマンスを少し上回らなければほぼ同じ結果を出しました。 – jondavidjohn
テーブルにどのようなインデックスがあるのか知っていますか?特に、show、show_time_schedules、show_times、およびshow_mediasのクエリインデックスに使用されているidカラムはどれですか? – dash