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, а потом мапить результаты, но хотелось бы без этого
Нашёл кривое решение через грязный и отвратительный хак.
В dql-адаптер для MBRContains дописал в конце определения функции в getSql() "AND 1", а в запросе пишу "MBRContains(...) AND 1=1".
Теперь индекс используется, всё работает, а я буду молиться, чтобы этот позор никто не увидел :)