Según el plan de explicación, el optimizador no puede usar ningún índice para ORDER BY rent
. Así que intente lo siguiente:
- Asegúrese de que exista un índice en el
rent_date
columna de losrents
mesa. Este índice se utilizará para optimizar elORDER BY
cláusula. Puede ser un índice de una sola columna o uno de varias columnas (usado en otros escenarios). Pero, en el caso de una de varias columnas, debe asegurarse de querent
columna es la primera columna en el orden del índice. - Asegúrese de que exista un índice en el
id
columna de loskickscooters
mesa. Los detalles sobre el índice de columna única/columna múltiple siguen siendo los mismos que en el punto n.º 1. - Asegúrese de que exista un índice en el
serial_number
columna dekickscooter_states_190614
mesa. Los detalles sobre el índice de columna única/columna múltiple siguen siendo los mismos que en el punto n.º 1.
Ahora, después de asegurar estos índices, intente su consulta original. Lo más probable es que el optimizador pueda optimizar la orden de unión. Además, la consulta anterior, puede hacer cumplir el orden de unión usando STRAIGHT_JOIN
sugerencia del optimizador. Entonces, intente la siguiente consulta también y haga un benchmark entre los dos:
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;