MySQLが空間インデックスのマージをサポートしていないためだと思います。それがまだ真実かどうかはわかりませんが、私は過去にどこかでそれを読んだことがあります。 ORステートメントがある場合、空間インデックスは使用されません
あなたの場合、points.id =1をどこで実行していますか。これは、mbrcontainsで使用される1つの結果が返されるストレートセレクトです。それはインデックスを使用します。
points.in(1,2,3)を追加すると、3つの結果が返され、それぞれが範囲テーブルにマップされる必要があるため、機能しません
結果
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE points range PRIMARY PRIMARY 4 NULL 3 100.00 Using where
1 SIMPLE ranges ALL poly NULL NULL NULL 6467418 100.00
次のようにすることで、ポイントテーブルなしでテストを簡略化できます。SELECT* FROM range where mbrcontains(poly、GEOMFROMWKB(POINT(0、0)))
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE ranges range poly poly 34 NULL 1 100.00 Using where
そして今これ; SELECT * FROM range where mbrcontains(poly、GEOMFROMWKB(POINT(0、0)))OR mbrcontains(poly、GEOMFROMWKB(POINT(10、10)))
結果
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE ranges ALL poly NULL NULL NULL 6467418 100.00 Using where
2番目のケースでは、インデックスを使用しておらず、スキャンしているだけです。
特定のポイントごとにUNIONを作成することで、クエリにインデックスを使用させることができますが、それが高速になるかどうかはわかりません。ローカルでいくつかのテストを行いましたが、最初のクエリよりも少し時間がかかりました。
EXPLAIN EXTENDED
SELECT *
FROM points
FORCE INDEX (PRIMARY )
LEFT JOIN ranges
FORCE INDEX ( poly ) ON mbrcontains( poly, point )
WHERE points.id = 1
UNION DISTINCT
SELECT *
FROM points
FORCE INDEX (PRIMARY )
LEFT JOIN ranges
FORCE INDEX ( poly ) ON mbrcontains( poly, point )
WHERE points.id = 2
UNION DISTINCT
SELECT *
FROM points
FORCE INDEX (PRIMARY )
LEFT JOIN ranges
FORCE INDEX ( poly ) ON mbrcontains( poly, point )
WHERE points.id = 3
結果
id select_type table type possible_keys key key_len ref rows filtered Extra
1 PRIMARY points const PRIMARY PRIMARY 4 const 1 100.00
1 PRIMARY ranges range poly poly 34 NULL 1 100.00 Using where
2 UNION points const PRIMARY PRIMARY 4 const 1 100.00
2 UNION ranges range poly poly 34 NULL 1 100.00 Using where
3 UNION points const PRIMARY PRIMARY 4 const 1 100.00
3 UNION ranges range poly poly 34 NULL 1 100.00 Using where
NULL UNION RESULT <union1,2,3> ALL NULL NULL NULL NULL NULL NULL