我有一个场景,虽然我已经优化了查询,但是不了解查询优化器选择使用特定索引的基础。我正在运行以下查询。
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通常更喜欢具有更高基数的索引。