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_date
ein Index vorhanden ist Spalte derrents
Tisch. Dieser Index wird verwendet, umORDER BY
zu 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 dierent
Spalte ist die erste Spalte in der Indexreihenfolge. - Stellen Sie sicher, dass ein Index für die
id
vorhanden ist Spalte derkickscooters
Tisch. Details zum einspaltigen / mehrspaltigen Index bleiben gleich wie in Punkt #1. - Stellen Sie sicher, dass ein Index für die
serial_number
vorhanden ist Spalte vonkickscooter_states_190614
Tisch. 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;