Това, което виждате, за съжаление е общ проблем с начина, по който пространствените функции се изпълняват в MySQL и свързана слабост с подзаявките, включващи пространствени функции.
За да работят правилно функциите съдържа и пресича и за да се използва индексът, трябва да имате една от геометриите да е константа. Това изглежда не е документирано, въпреки че всички примери, които ще видите с MySQL с Intersects/Contains, работят по този начин.
Така че не можете да напишете нещо подобно, както бихте могли в Oracle Spatial или Postgis,
select a.*, b.*
from sometable a, someothertable b
where ST_Intersects(a.geom, b.geom)
and a.someattribute=... and b.someattribute=...;
При такава заявка, ако и двете таблици a и b имат пространствени индекси, те ще бъдат използвани, при условие че това е по-ограничително от някой друг атрибут, който можете да поставите в клаузата where.
Същото важи и за самостоятелно свързване, където искате да намерите всички полигони, които се пресичат с всички други многоъгълници в таблица въз основа на някакъв атрибут, напр.
select a.*
from sometable a, sometable b
where ST_Intersects(a.geom, b.geom) ....
Така че в MySQL spatial вие сте принудени една от геометриите да бъде константа.
Като настрана, синтаксисът на лявото присъединяване няма много смисъл с пространственото (въпреки че се поддържа), тъй като всъщност не се присъединявате към един съвпадащ атрибут, а към двуизмерен оператор за ограничаване/пресичане.
Освен това съм почти сигурен, че на вашето вътрешно съединение индексът не се използва, ако погледнете key
и rows
изход на обяснение.