MySQL多部分索引不过滤数据集

时间:2013-12-02 16:01:10

标签: mysql

我有两张桌子,一张可以在一年中的任何时候举办活动,另一张则将这些活动连接到学年。我可以检索相应的学年,但事件表上的多部分索引似乎没有过滤数据集。

我已经尝试了这两种方法,以及翻转连接表的顺序(如果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行?查询需要半秒才能执行,这似乎太慢了。

1 个答案:

答案 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