MySQL索引选择标准

时间:2010-10-21 07:29:42

标签: mysql indexing

我有一个场景,虽然我已经优化了查询,但是不了解查询优化器选择使用特定索引的基础。我正在运行以下查询。     

    SELECT r.review_id FROM game_reviews r
    INNER JOIN game_subchannel gs ON r.game_id = gs.game_id
    WHERE gs.subchannel_id=4

我的表game_subchannel是一个将game_id映射到subchannel_id的关系表。最初我在game_id和subchannel_id列上有一个多列索引game_subchannel_idx。这两列的索引基数是4547,即表中的行数。当我在查询时EXPLAIN只有game_subchannel_idx时,它会在Extra列中显示3411行和using where, using index,正如我读过的那样意味着它正在进行完整的索引扫描&安培;并且没有像我理想的那样使用索引。

我在这里的第一个案例的问题是,为什么MySQL没有使用game_subchannel_idx基于给定条件来挑出行?,即为什么要查看3411行?我的理解是它应该有一组狭窄的行来查看。那么为什么要进行全索引扫描?

稍后我所做的是仅在subchannel_id列上创建一个新的单列索引subchannel_idx。此处的索引基数为32.现在,当我对此查询执行EXPLAIN时,它会在“可能的键”列中显示索引,在键列中显示subchannel_idx。 并且在行列中有645。 Extra列为空。显然我现在已经优化了查询,即3411对645.但我不明白这个过程,有很多混乱。我对第二种情况的问题是,为什么MySQL更喜欢subchannel_idx而不是game_subchannel_idx,即使前者的基数非常低?我读过的是MySQL通常更喜欢具有更高基数的索引。

1 个答案:

答案 0 :(得分:0)