MySQL, spatial-индекс и Doctrine — как заставить их работать вместе?

У меня есть таблица MySQL с полем типа POINT и Spatial key на нём, использую ORM Doctrine.
Ищу попадание точки в область с помощью MBRContains().
Написал dql-адаптер для MBRContains.
Doctrine требует, чтобы в блоке WHERE после функции стоял один из знаков [=, <, <=, <>, >, >=, !=], и это в общем случае логично. Поэтому дописал в запросе WHERE MBRContains(...) = 1. Всё работает.
НО!
Начал тестить и увидел, что индекс не используется. Explain даже в possible_keys его не показывает.
Запускаю разные варианты запроса в консоли и вижу, что "WHERE MBRContains(...)" использует индекс, а "WHERE MBRContains(...) = 1" – не использует. Но Doctrine не даёт написать в DQL "WHERE MBRContains(...)".

Как-то можно их подружить? Или заставить MySQL использовать индекс?
FORCE INDEX не помогает.

На крайняк остаётся вариант использовать raw sql, а потом мапить результаты, но хотелось бы без этого
  • Вопрос задан
  • 262 просмотра
Пригласить эксперта
Ответы на вопрос 1
zIs
@zIs Автор вопроса
Нашёл кривое решение через грязный и отвратительный хак.
В dql-адаптер для MBRContains дописал в конце определения функции в getSql() "AND 1", а в запросе пишу "MBRContains(...) AND 1=1".
Теперь индекс используется, всё работает, а я буду молиться, чтобы этот позор никто не увидел :)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы