我有两张桌子,一张可以在一年中的任何时候举办活动,另一张则将这些活动连接到学年。我可以检索相应的学年,但事件表上的多部分索引似乎没有过滤数据集。
我已经尝试了这两种方法,以及翻转连接表的顺序(如果MySQL的从左到右的索引用法正在发挥作用),但这些变化没有区别。
SELECT y.school_year FROM events e,years y WHERE e.yid = y.id AND e.year = y.year GROUP BY y.school_year ORDER BY y.school_year DESC
SELECT DISTINCT y.school_year FROM events e,years y WHERE e.yid = y.id AND e.year = y.year ORDER BY y.school_year DESC
EXPLAIN输出:
id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE e index meet_year meet_year 9 NULL 486200 Using index; Using temporary; Using filesort 1 SIMPLE y eq_ref PRIMARY PRIMARY 8 e.yid,e.year 1
以下是events表中包含486,200行的相关索引:
Keyname Type Cardinality Field event_year INDEX 978 yid, year
EXPLAIN不应该显示978行,而不是全部486,200行?查询需要半秒才能执行,这似乎太慢了。
答案 0 :(得分:1)
由于您没有其他过滤器和GROUP BY,因此查询计划程序决定执行全表扫描。您可以尝试这一点,看看EXPLAIN输出是否显示正在处理的行数较少:
SELECT DISTINCT y.school_year
FROM years y
JOIN (
SELECT DISTINCT e.yid, e.year
FROM events e
) e ON e.yid = y.id AND e.year = y.year