SQL クエリを最適化しようとしていますが、正しく行う方法を知りたいです。
リーリーここでは、インデックス (booking_id, from_spot_id, to_spot_id)
を強制します。これにより、クエリは最も近い日付から 25 秒以内に約 100 ミリ秒実行されます。
booking
テーブルには約 200 万行があり、ride
テーブルには約 500 万行があります。
ただし、強制インデックスを使用してより多くの行をスキャンしていることがわかります:
id | タイプを選択してください | ###表面### ###パーティション### ###タイプ###使用可能なキー | ###鍵###key_len | ###参照する### ###わかりました###フィルタ済み | ###追加###1 | ###単純###b1_ | ###範囲### | メイン、booking_id_end_IDX、booking_id_IDX、booking_id_start_IDX、IDX_E00CEDDEB75363F7、IDX_E00CEDDE37D3107C、IDX_E00CEDDEDEA4208C、booking_paid_at_IDX、booking_cancelled_at_IDX | IDX_E00CEDDE37D3107C | ||
---|---|---|---|---|---|---|---|---|---|---|---|
111456 | 6.6 | インデックス条件を使用し、場所を使用します | 1 | ###単純###r0_ | ###参照する### | ride_booking_id_IDX | ride_booking_id_IDX | 109 | ector.b1_.id | 1 | |
1 | ###単純###s2__ | eq_ref | メイン、IDX_B9327A739F2C3FAB、スポットタイプ_IDX | ###主要###4 | ector.r0_.from_spot_id | 1 | 72.52 | 使用場所 | |||
1 | ###単純###s3_ | eq_ref | ###主要### ###主要###4 | ector.r0_.to_spot_id | 1 | 100.0 | 使用場所 | インデックスを使用しない同じクエリとの比較: | |||
id | タイプを選択してください | ###表面### ###パーティション### ###タイプ###使用可能なキー | ###鍵###key_len | ###参照する### ###わかりました###フィルタ済み | ###追加###1 | ###単純###s2__ | ###参照する### | メイン、IDX_B9327A739F2C3FAB、スポットタイプ_IDX | スポットタイプ_IDX |
100.0
1 | ###単純###r0_ | ###参照する### | IDX_9B3D7CD0ABAF30D3、IDX_9B3D7CD03301C60、ride_booking_id_IDX、booking_from_spot_to_spot_IDX | IDX_9B3D7CD0ABAF30D3 | 5 | ector.s2_.id | 392 | 100.0 | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
eq_ref | メイン、booking_id_end_IDX、booking_id_IDX、booking_id_start_IDX、IDX_E00CEDDEB75363F7、IDX_E00CEDDE37D3107C、IDX_E00CEDDEDEA4208C、booking_paid_at_IDX、booking_cancelled_at_IDX | ###主要###108 | ector.r0_.booking_id | 1 | 5.0 | 使用場所 | 1 | ###単純###s3_ | ||||||||||||||||||||||
4 | ector.r0_.to_spot_id | 1 | 100.0 | 使用場所 | 私の知る限り、 そこで、最も遅い部分をより小さなクエリに分離しようとします。
テーブル予約には、 ただし、かなり過去のランダムな値を使用すると、処理が大幅に遅くなります。上記のクエリは、予想どおり 2 つのインデックスのうち 1 つだけを使用するため、実行に 10 秒かかります。なぜこのような単純なクエリに merge_index の説明が表示されないのかわかりません。
index_merge=on、index_merge_union=on、index_merge_sort_union=on、index_merge_intersection=on、engine_condition_pushdown=on、index_condition_pushdown=on、mrr=on、mrr_cost_based=on、block_nested_loop=on、batched_key_access=off、materialization=on、 semijoin=on、loosescan=on、firstmatch=on、duplicateweedout=on、subquery_materialization_cost_based=on、use_index_extensions=on、condition_fanout_filter=on、provided_merge=on、use_invisible_indexes=off、skip_scan=on、hash_join=on、subquery_to_derivative=off、prefer_ordering_index=オン、ハイパーグラフオプティマイザー=オフ、derivative_condition_pushdown=on 全員に返信(1)返信しますP粉0186537512023-09-08 23:04:14 検索する固定の ユースケースに応じて、 単一のインデックスを使用する場合、インデックスは定義された順序と同じ順序で使用されるため、フィールドの順序を慎重に選択する必要があります。 編集: OP 編集後の私の感想は次のとおりです。 これは物事を非常によく説明しています。 返事 0 |