【发布时间】:2012-01-09 02:41:39
【问题描述】:
这是整个查询...
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?
解释扩展
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 取决于您是否只想显示带有 url 的节目)查看了性能,加入 show_medias on show_medias.show_id = s.id 而不是做选择列表中的子查询?我有兴趣看到那个。查询的 EXPLAIN 中有什么内容吗?
-
@dash 非常感谢您迄今为止的帮助,添加了
EXPLAIN EXTENDED,并且您建议的查询产生了几乎相同的 6.x 秒性能。 -
您知道您的表上有哪些索引吗?特别是,在节目、show_time_schedules、show_times 和 show_medias 的查询索引中是否使用了任何 id 列?
-
出于兴趣,删除 ORDER BY 会加快您的查询速度吗?
-
@dash 我的天哪...感谢提及索引...这是我在学会将外部 id 字段与主要字段一起索引之前所做的一个旧项目...在应用外键之后索引查询在 0.0064 秒时嗡嗡作响...将其添加到您的答案中,我们将把这件事包起来...谢谢!
标签: mysql sql optimization