Rozwiązałem mój problem z wolnymi zapytaniami. Podsumowując problem, zapytanie o 7000 wierszy z 20 mln wierszy i zindeksowanej tabeli 1,7 GB zajęło 22 sekundy. Problem polegał na tym, że pamięć podręczna była zbyt mała i zapytanie musiało trafiać na dysk dla każdego zapytania. Myślałem, że dostęp do dysku byłby szybszy niż to, co widziałem, ponieważ wychodziłem z indeksowanej kolumny, więc ilość danych odczytanych z dysku powinna być niewielka. Ale domyślam się, że dostęp do pamięci InnoDB na dysku wiąże się z dużym obciążeniem.
Po ustawieniu innodb_buffer_pool_size=1024M
w pliku my.ini początkowe zapytanie zajęłoby dużo czasu, ale wszystkie kolejne zapytania zakończyłyby się w mniej niż sekundę.
Niestety profilowanie tak naprawdę nie pomogło.