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

Бавна заявка за резултати от търсене, базирана на местоположение

Можете да използвате пространственото разширение на mysql и да запазите географската ширина и дължина като точков тип данни и да го направите пространствен индекс. По този начин можете да пренаредите координатите по крива и да намалите измерението и да запазите пространствената информация. Можете да използвате пространствения индекс като ограничително поле, за да филтрирате заявката и след това да използвате формулата на harvesine, за да изберете оптималния резултат. Вашата ограничителна кутия трябва да е по-голяма от радиуса на големия кръг. Mysql използва rtree с някакъв пространствен индекс и моят пример беше за z крива или крива на Hilbert:https://softwareengineering.stackexchange.com/questions/113256/what-is-the-difference-between-btree-and-rtree-indexing .След това можете да вмъкнете геокоордината директно в колона с точка:http://dev.mysql.com/doc/refman/5.0/en/creating-spatial-values.html . Или можете да използвате тип данни за геометрия:http:// markmaunder.com/2009/10/10/mysql-gis-extensions-quick-start/ . След това можете да използвате функцията MBRcontains така: http://dev.mysql.com/doc/refman/4.1/en/relations-on-geometry-mbr.html или всякакви други функции:http://dev.mysql.com/doc/refman/5.5/en/functions-for-testing-spatial-relations-between-geometric-objects.html . Следователно имате нужда от ограничаваща кутия. Ето някои примери:

Ето един прост пример с точков тип данни:

    CREATE SPATIAL INDEX sx_place_location ON place (location)

    SELECT  * FROM    mytable
    WHERE   MBRContains
           (
           LineString
                   (
                   Point($x - $radius, $y - $radius),
                   Point($x + $radius, $y + $radius)
                   )
           location
           )
    AND Distance(Point($x, $y), location) <= $radius

Не съм сигурен дали работи, защото използва променлива радиус с функция за ограничаваща кутия. Струва ми се, че MBRwithin е малко по-прост, защото не се нуждае от никакви аргументи:Mysql:Оптимизиране на намирането на супер възел във вложено дърво на набори .



  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?

  2. Параметризирани заявки PHP/MySQL

  3. 2 начина за конвертиране между десетичен и шестнадесетичен в MySQL

  4. Прехвърлете QR кода в MySql база данни

  5. Проста подзаявка с OuterRef