【问题标题】:low cardinality index still slows query down低基数索引仍然会减慢查询速度
【发布时间】:2013-05-03 21:18:49
【问题描述】:

在 InnoDB 中使用 MySQL 5.5。 有一个类似的查询

    SELECT
        count(distinct a.thing_id) as new_thing_count,
        sum(b.price) as new_thing_spend
    FROM thing ii
    LEFT OUTER JOIN thing a
        ON a.customer_id = ii.customer_id
        AND a.created_at >= '2013-01-01'
        AND a.created_at <= '2013-03-31'
    JOIN whatsit b
        ON b.whatsit_id = a.original_whatsit_id
    WHERE ii.customer_id = 3

在哪里

  • thing 的基数约为 25k,其中 3.5k 属于客户 3
  • 有 12 个可能的customer_ids

现在,当我使用customer_id 上的索引运行此查询时,大约需要 10 秒。当我删除索引时,需要 0.03 秒。

我不知道为什么会这样。这是没有索引的解释结果:

1   SIMPLE  ii  ALL                 24937   Using where
1   SIMPLE  a   ALL                 24937   Using where; Using join buffer
1   SIMPLE  b   eq_ref  PRIMARY PRIMARY 4   db.a.original_whatsit_id    1   

这里是索引 (thing_customer)

1   SIMPLE  ii  ref thing_customer  thing_customer  4   const   3409    Using index
1   SIMPLE  a   ref thing_customer  thing_customer  4   const   3409    Using where
1   SIMPLE  b   eq_ref  PRIMARY PRIMARY 4   db.a.original_whatsit_id    1   

有人能帮我解释一下为什么这个索引在逻辑上看起来不应该的情况下让事情变慢这么多吗?

【问题讨论】:

    标签: mysql indexing innodb


    【解决方案1】:

    当您的数据库引擎决定读取索引时,它会按顺序逐行读取。这可能导致它读取磁盘第 2 页中的一行,第 4 页中的另一个,第 1 页中的另一个,第 2 页中的下一个,等等。

    有时,来回走动导致索引无济于事——相反。

    如果数据库引擎在生成查询计划时在收集和分析表的统计信息方面做得不好,它可能无法识别索引产生完全碎片化的磁盘读取。这可能是您正在经历的。

    尝试分析表格以收集新的统计数据:

    http://dev.mysql.com/doc/refman/5.5/en/analyze-table.html

    然后在使用和不使用索引的情况下重试。

    【讨论】:

    • 似乎是合理的建议,但实际上它并没有加速查询......事实上,数据很可能非常分散。这种情况下有什么办法吗?
    • 好吧,如果您不断地查询一个字段,您可以在其上创建一个聚集索引,以便相应地对表进行排序。在您的情况下,(customer_id, created_at) 上的一个实际上可能有意义。
    • 如果您的数据不敏感,您可以做的另一件事是在 mysql 上报告错误。当它意味着在整个地方来回读取行时,计划者应该比使用索引更清楚。 (如果可以切换的话,Postgres,fwiw,在这方面做得很好。)
    • 每个表只允许一个聚集索引,我在 thing_id 上有一个(作为事物的主键),它在任何地方都连接,所以我想保留那个。是的,有人说要改用 Postgres 或类似的,但还没有发生。我想现在我会删除索引...谢谢!
    猜你喜欢
    • 2016-08-28
    • 1970-01-01
    • 2011-11-19
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 2011-10-04
    相关资源
    最近更新 更多