Thật không may, những gì bạn đang thấy là một vấn đề chung với cách các hàm không gian được triển khai trong MySQL và một điểm yếu liên quan với các truy vấn con liên quan đến các hàm không gian.
Để các hàm Chứa và Giao điểm hoạt động bình thường và để chỉ mục được sử dụng, bạn cần phải có một trong các dạng hình học là một hằng số. Điều này dường như không được ghi lại, mặc dù tất cả các ví dụ bạn sẽ thấy với MySQL với Intersects / Contains hoạt động theo cách này.
Vì vậy, bạn không thể viết một cái gì đó như thế này, như bạn có thể làm trong Oracle Spatial hoặc Postgis,
select a.*, b.*
from sometable a, someothertable b
where ST_Intersects(a.geom, b.geom)
and a.someattribute=... and b.someattribute=...;
Trong một truy vấn như vậy, nếu cả bảng a và b đều có chỉ mục không gian, chúng sẽ được sử dụng, với điều kiện thuộc tính này hạn chế hơn một số thuộc tính khác mà bạn có thể đặt trong mệnh đề where.
Điều tương tự cũng áp dụng cho liên kết tự, trong đó bạn muốn tìm tất cả các đa giác giao với tất cả các đa giác khác trong một bảng dựa trên một số thuộc tính, ví dụ:
select a.*
from sometable a, sometable b
where ST_Intersects(a.geom, b.geom) ....
Vì vậy, trong không gian MySQL, bạn buộc phải có một trong các dạng hình học là một hằng số.
Ngoài ra, cú pháp nối bên trái không có nhiều ý nghĩa với không gian (mặc dù nó được hỗ trợ), vì bạn không thực sự tham gia trên một thuộc tính đối sánh duy nhất, mà là trên toán tử ngăn / giao nhau 2 chiều.
Ngoài ra, tôi khá chắc chắn rằng trong tham gia bên trong của bạn, chỉ mục không được sử dụng, nếu bạn nhìn vào khóa key
và rows
đầu ra của giải thích.