W oparciu o plan Explain optymalizator nie może używać żadnego indeksu dla ORDER BY rent
. Spróbuj więc wykonać następujące czynności:
- Upewnij się, że indeks istnieje w dniu
rent_date
kolumnarents
stół. Ten indeks zostanie użyty do optymalizacjiORDER BY
klauzula. Może to być indeks jednokolumnowy lub wielokolumnowy (używany w innych scenariuszach). Ale w przypadku wielokolumnowego, musisz upewnić się, żerent
kolumna jest pierwszą kolumną w kolejności indeksu. - Upewnij się, że indeks istnieje w
id
kolumnakickscooters
stół. Szczegóły dotyczące indeksu jedno- / wielokolumnowego pozostają takie same jak w punkcie 1. - Upewnij się, że pod
serial_number
istnieje indeks kolumnakickscooter_states_190614
stół. Szczegóły dotyczące indeksu jedno- / wielokolumnowego pozostają takie same jak w punkcie 1.
Teraz, po sprawdzeniu tych indeksów, wypróbuj oryginalne zapytanie. Najprawdopodobniej optymalizator powinien być w stanie zoptymalizować kolejność łączenia. Poza tym, powyższe zapytanie, możesz wymusić kolejność złączenia za pomocą STRAIGHT_JOIN
wskazówka optymalizatora. Wypróbuj również następujące zapytanie i porównaj je:
select
r.user_id,
k.id as kickscooter_id,
st_astext(k.location) as location,
k.created_at,
k.serial_number,
k_st.serial_number as states_serial_number,
st_astext(k_st.gps) as gps_location,
k_st.gps_updated_at,
r.start_time,
r.end_time
from kickscooters k
straight_join rents r
on k.id= r.kickscooter_id
straight_join kickscooter_states_190614 k_st
on k.serial_number = k_st.serial_number
order by r.rent_date
limit 999;