【问题标题】:MySQL multiple-part index not filtering data setMySQL多部分索引不过滤数据集
【发布时间】:2013-12-02 16:01:10
【问题描述】:

我有两张桌子,一张举办一年中任何时候都可能发生的活动,另一张则将这些活动与学年联系起来。我可以检索相应的学年,但事件表上的多部分索引似乎没有过滤数据集。

我已经尝试了这两种方法,以及翻转连接表的顺序(以防 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

解释输出:

id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE e index meet_year meet_year 9 NULL 486200 使用索引;使用临时的;使用文件排序 1 SIMPLE y eq_ref PRIMARY PRIMARY 8 e.yid,e.year 1

这是包含 486,200 行的事件表上的相关索引:

键名类型基数字段 event_year INDEX 978 yid,年份

不应该 EXPLAIN 显示 978 行,而不是全部 486,200?该查询需要半秒才能执行,这似乎太慢了。

【问题讨论】:

    标签: mysql


    【解决方案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
    

    【讨论】:

    • 完美,谢谢!我想知道 GROUP BY 是否是问题所在,这就是为什么我也只用 DISTINCT 尝试过。您的方法产生 0.0170 秒的查询(低于 0.5 秒)和更合理的 979 行扫描。我没有考虑为此目的使用子选择,但这是有道理的,因为事件表上不需要过滤。
    猜你喜欢
    • 2021-12-10
    • 2023-04-08
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2020-02-22
    • 2015-05-26
    相关资源
    最近更新 更多