Basierend auf dem Explain-Plan kann der Optimierer keinen Index für ORDER BY rent verwenden . Versuchen Sie also Folgendes:
- Stellen Sie sicher, dass am
rent_dateein Index vorhanden ist Spalte derrentsTisch. Dieser Index wird verwendet, umORDER BYzu optimieren Klausel. Es kann sich um einen einspaltigen oder einen mehrspaltigen Index handeln (der in anderen Szenarien verwendet wird). Aber im Falle einer mehrspaltigen müssen Sie sicherstellen, dass dierentSpalte ist die erste Spalte in der Indexreihenfolge. - Stellen Sie sicher, dass ein Index für die
idvorhanden ist Spalte derkickscootersTisch. Details zum einspaltigen / mehrspaltigen Index bleiben gleich wie in Punkt #1. - Stellen Sie sicher, dass ein Index für die
serial_numbervorhanden ist Spalte vonkickscooter_states_190614Tisch. Details zum einspaltigen / mehrspaltigen Index bleiben gleich wie in Punkt #1.
Versuchen Sie nun, nachdem Sie diese Indizes sichergestellt haben, Ihre ursprüngliche Abfrage. Höchstwahrscheinlich sollte der Optimierer in der Lage sein, die Join-Reihenfolge zu optimieren. Außerdem können Sie bei der obigen Abfrage die Join-Reihenfolge erzwingen, indem Sie STRAIGHT_JOIN verwenden
Optimierungshinweis. Probieren Sie also auch die folgende Abfrage aus und vergleichen Sie die beiden:
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;