SQLクエリを実行して、特定の場所がポリゴンで定義された管轄区域に該当するかどうかを確認するアプリケーションを開発中です。これらの管轄区域は四半期ごとに更新されます。つまり、私がチェックしている日付と照合する必要があります。私はmySQL関数MBRContains
を使用して、私が見ている管轄区域の絞り込みを行い、アプリケーションが特定の点がそれらのいずれかにあるかどうかを簡単に確認できるようにしています。今、私のクエリは次のようになります。評価の順序を変更してSQLクエリの実行時間を短縮する
SELECT DISTINCT t0.id FROM jurisdiction t0
WHERE t0.beginDate <= '2017-08-05' AND t0.endDate >= '2017-08-05'
AND MBRContains(t0.geometry,GeomFromText("POINT(48.0 -120.0)"));
私はMBRContainsが日付をチェックするよりも高価な操作であることをかなり確信しているが、私は多くのSQLで働いていないと私は作る方法がわかりませんよ管轄区域は最初に日付でフィルタリングされ、次にMBRContainsに対してチェックされます。これどうやってするの?このクエリで同じ結果を達成しながら他にも最適化を行うことはできますか?
入力ミスであるかどうかはわかりませんが、入力が間違っています。 1つは、日付フィールドは 'DATE'データ型でなければなりません。文字列の値に固執しても、その比較が実際に意味をなされるように文字列をフォーマットする必要があります('06 -08-2001 'の終了日は'05 -08-2017'の後にあります。 '04 -08-2020の開始日は'05 -08-2017 'の前です) – Uueerdo
@Uueerdo日付とポイントは例です。私はそれが正しい日付で渡され、結果を正しくフィルタリングしていることを確認しました。それは単にクエリが長時間かかるということだけです。 – user3726962
beginDate、endDate、およびgeometryでインデックスを使用すると、アクセスが高速化されます。 – hackela