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;