Проблема с производительностью ST_CONTAINSMySql

Форум по Mysql
Ответить
Anonymous
 Проблема с производительностью ST_CONTAINS

Сообщение Anonymous »

У меня возникла проблема с производительностью запроса в MySQL. Мне нужно сравнить данные о местоположении, и я пытаюсь использовать ST_CONTAINS в соединении. Однако у меня возникла проблема с производительностью, поскольку получение 1000 записей происходит довольно медленно: около 16 секунд. Мне нужно обработать несколько тысяч записей в запросе. Я ищу в Интернете лучшее решение. Я уже пробовал использовать другие функции проверки, ST_Within и MBRContains. Я добавил пространственный индекс для геостолбца, задав тот же SRID, но, к сожалению, индекс не захотел использовать сам себя. Я принудительно использовал его с помощью USE INDEX, но это сделало запрос еще медленнее. Я создал отдельный столбец точек, чтобы избавиться от Point(address.lat, Address.lng), но безрезультатно. Могу ли я еще что-нибудь сделать? Кто-нибудь сталкивался с этой проблемой или имеет какие-либо идеи по решению, или может указать, что я делаю неправильно? Кроме того, я включаю запросы объяснения.
Время выполнения: 12 секунд

Код: Выделить всё

SELECT * FROM table_localities AS address
LEFT JOIN table_province AS province ON (ST_CONTAINS(province.geo, Point(address.lat, address.lng)))
WHERE province.delivery_area_id = :id


id
select_type
таблица
разделы
тип
возможные_ключи
ключ
key_len
ref
строки
фильтрованные
Дополнительный




1
ПРОСТОЙ
адрес

ALL
fk_delivery_area_id



1850
50.0
Использование где


1
ПРОСТОЙ
регион

ref
fk_delivery_area_id,idx_geo
fk_delivery_area_id
8
const
300
100,0
Использование где



Время выполнения: гораздо больше, чем 16 секунд

Код: Выделить всё

SELECT * FROM table_localities AS address
LEFT JOIN table_province AS province USE INDEX (idx_geo) ON (ST_CONTAINS(province.geo, Point(address.lat, address.lng)))
WHERE province.delivery_area_id = :id


id
select_type
таблица
разделы
тип
возможные_ключи
ключ
key_len
ref
строки
фильтрованные
Дополнительный




1
ПРОСТОЙ
адрес

ALL
fk_delivery_area_id



1850
50.0
Использование где


1
ПРОСТОЙ
регион

ВСЕ
idx_geo



21699
100,0
Диапазон проверяется для каждой записи (карта индекса: 0x20)




Подробнее здесь: https://stackoverflow.com/questions/798 ... t-contains
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «MySql»