Explainプランに基づいて、オプティマイザーはORDER BY rentにインデックスを使用できません。 。したがって、次のことを試してください。
-
rent_dateにインデックスが存在することを確認しますrentsの列 テーブル。このインデックスは、ORDER BYを最適化するために使用されます 句。これは、単一列のインデックスでも、複数列のインデックス(他のシナリオで使用される)でもかまいません。ただし、複数列の場合は、rentを確認する必要があります。 columnは、インデックス順の最初の列です。 -
idにインデックスが存在することを確認しますkickscootersの列 テーブル。単一列/複数列のインデックスの詳細は、ポイント#1と同じです。 -
serial_numberにインデックスが存在することを確認しますkickscooter_states_190614の列 テーブル。単一列/複数列のインデックスの詳細は、ポイント#1と同じです。
次に、これらのインデックスを確認した後、元のクエリを試してください。ほとんどの場合、オプティマイザは結合順序を最適化できるはずです。さらに、上記のクエリでは、 STRAIGHT_JOINを使用して結合順序を適用できます。
オプティマイザのヒント。したがって、次のクエリも試して、2つのクエリの間でベンチマークを実行してください。
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;