I have the following query to select users and their locations, etc from MySQL (all InnoDB). The table user, blocked_user and blocked_countries have about 2mil rows each, countries about 250, regions about 3500 and cities about 2.8mil.
The Problem is that the query is quite fast (0.05sec) without AND co.country_id='us' in the WHERE clause. However, I tried around so much but just have the feeling that there must be certainly a much easier and better way for this query, no?
What am I missing? Any help is highly appreciated! Thank you very much in advance!
Thank you again for your help. Finally, I’ve found the direction where to solve the problem. The performance problem was mainly caused because of a mixture between a range scan and an
ORDER BY ... LIMIT.So, I’ve learned a lot (new to me) about indexing and found that if you have a range scan (as in my case age between x and y), then the ranging column must be the last in a concatenated index, otherwise the index cannot be used entirely. In addition, the column used to sort the results, must the last in the index. So, given a mixture between range scan and
ORDER BY, you need to decide if the index should be used to sort or to select.In my case it means thinking of some good combinations for several indexes, where the left over rows to be sorted are just a very few or if the search cannot be narrowed down to just some rows, a separate index that will be used for sorting as the query will then quickly find the number of rows as given by
LIMIT.