Baseret på Explain-planen er optimizer ikke i stand til at bruge noget indeks til ORDER BY rent
. Så prøv følgende:
- Sørg for, at der findes et indeks på
rent_date
kolonne irents
bord. Dette indeks vil blive brugt til at optimereORDER BY
klausul. Det kan være et enkelt kolonneindeks eller et flerkolonneindeks (bruges i andre scenarier). Men i tilfælde af en flerkolonne, skal du sikre dig, atrent
kolonne er den første kolonne i indeksrækkefølgen. - Sørg for, at der findes et indeks på
id
kolonne afkickscooters
bord. Detaljer om enkelt-kolonne/flerkolonneindeks forbliver de samme som i punkt #1. - Sørg for, at der findes et indeks på
serial_number
kolonne ikickscooter_states_190614
bord. Detaljer om enkelt-kolonne/flerkolonneindeks forbliver de samme som i punkt #1.
Nu, efter at have sikret disse indekser, prøv din oprindelige forespørgsel. Mest sandsynligt burde optimizer være i stand til at optimere Join Order. Derudover, ovenstående forespørgsel, kan du gennemtvinge deltagelsesordre ved at bruge STRAIGHT_JOIN
optimeringstip. Så prøv også følgende forespørgsel, og benchmark mellem de to af dem:
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;