Na základě plánu Explain není optimalizátor schopen použít žádný index pro ORDER BY rent
. Zkuste tedy následující:
- Ujistěte se, že k datu
rent_date
existuje index ve sloupcirents
stůl. Tento index bude použit k optimalizaciORDER BY
doložka. Může to být index s jedním sloupcem nebo index s více sloupci (používá se v jiných scénářích). V případě vícesloupcového však musíte zajistit, abyrent
sloupec je první sloupec v pořadí indexu. - Ujistěte se, že na
id
existuje index ve sloupcikickscooters
stůl. Podrobnosti o jednosloupcovém / vícesloupcovém indexu zůstávají stejné jako v bodě #1. - Ujistěte se, že na
serial_number
existuje index sloupeckickscooter_states_190614
stůl. Podrobnosti o jednosloupcovém / vícesloupcovém indexu zůstávají stejné jako v bodě #1.
Nyní, po zajištění těchto indexů, zkuste svůj původní dotaz. S největší pravděpodobností by měl být optimalizátor schopen optimalizovat objednávku spojení. Kromě toho, výše uvedený dotaz, můžete vynutit pořadí připojení pomocí STRAIGHT_JOIN
tip na optimalizaci. Zkuste tedy také následující dotaz a porovnejte mezi nimi:
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;