Mysql
 sql >> база данни >  >> RDS >> Mysql

MYSQL с помощта на пространствен индекс

Това, което виждате, за съжаление е общ проблем с начина, по който пространствените функции се изпълняват в 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 изход на обяснение.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL DELETE FROM с подзаявка като условие

  2. Защо този пример за избор на актуализация работи?

  3. PHP PDO - брой редове

  4. MySQL - Операнд трябва да съдържа 1 колона(и)

  5. Използване на курсора в цикъл на съхранена процедура