indexing – MySQL index selection criteria – Education Career Blog

I have a scenario, where I have though optimized the query, but don’t understand on what basis the query optimizer choses to use a particular index. I am running the following query.

    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

My table game_subchannel is a relationship table that maps game_id to subchannel_id. Initially I had a multiple column index game_subchannel_idx on game_id and subchannel_id columns. The index cardinality for both these columns is 4547, i.e. the number of rows in the table. When I did EXPLAIN on the query with only game_subchannel_idx in place, it would show 3411 rows and using where, using index in the Extra column, which as I have read means that it’s doing a full index scan & and not utilizing the index as I would ideally like it to.

My question here for the first case is that why is MySQL not using the game_subchannel_idx to single out rows based on the given condition?, i.e. why looking at 3411 rows? My understanding is that it should have a narrow set of rows to look at. And hence why is it doing a full index scan?

Later on what I did is create a new single column index subchannel_idx only on the subchannel_id column. The index cardinality here is 32. Now when I do EXPLAIN on this query, it shows both index in ‘possible keys’ column and subchannel_idx in key column.
And 645 in the rows column. And the Extra column is empty. So apparently I have now optimized the query, i.e. 3411 vs 645. But I don’t understand the process, there’s a lot of confusion. My question for the second case is why does MySQL prefer subchannel_idx over game_subchannel_idx, even though the former has a very low cardinality? What I have read is that MySQL usually prefers indexes with higher cardinality.

,

For MySQL >5.0. http://dev.mysql.com/doc/refman/5.0/en/index-hints.html

Leave a Comment