Op basis van het Explain-plan kan optimizer geen index gebruiken voor ORDER BY rent
. Dus probeer het volgende:
- Zorg ervoor dat er een index bestaat op de
rent_date
kolom van derents
tafel. Deze index wordt gebruikt om deORDER BY
. te optimaliseren clausule. Het kan een index met één kolom zijn of een index met meerdere kolommen (gebruikt in andere scenario's). Maar in het geval van een kolom met meerdere kolommen, moet u ervoor zorgen dat derents
kolom is de eerste kolom in de indexvolgorde. - Zorg ervoor dat er een index bestaat op de
id
kolom van dekickscooters
tafel. Details over index met één kolom / meerdere kolommen blijven hetzelfde als in punt #1. - Zorg ervoor dat er een index bestaat op het
serial_number
kolom van dekickscooter_states_190614
tafel. Details over index met één kolom / meerdere kolommen blijven hetzelfde als in punt #1.
Probeer nu, nadat u deze indexen hebt gecontroleerd, uw oorspronkelijke zoekopdracht. Hoogstwaarschijnlijk zou de optimizer in staat moeten zijn om de Join Order te optimaliseren. Bovendien kun je met de bovenstaande zoekopdracht de samenvoegingsvolgorde afdwingen door STRAIGHT_JOIN
te gebruiken
optimalisatie hint. Probeer dus ook de volgende query en benchmark tussen de twee:
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;