У меня есть запрос MySQL, который отображает пользователей к зонам в зависимости от их расположения, а также границы зон:Переписать SQL подзапрос с ЗАКАЗА ... LIMIT с помощью JOIN
UPDATE User u SET u.zoneId = (
SELECT z.id FROM Zone z
WHERE ST_Contains(z.boundary, u.location)
ORDER BY z.level DESC
LIMIT 1
);
Это прекрасно работает, но это довольно медленно поскольку он выполняет подзапрос для каждой отдельной записи.
Можно ли переписать его с помощью JOIN, хотя он использует ORDER BY ... LIMIT 1
в подзапросе?
Этот ORDER BY ... LIMIT 1
необходим, поскольку несколько инкапсулированных зон могут соответствовать местоположению, и должен быть назначен только самый маленький (самый высокий уровень).
@ user2864740 Можете ли вы разработать ..? – Benjamin
На самом деле, я не уверен, так как это ОБНОВЛЕНИЕ - суб-выбор - это просто выбрать значение. – user2864740
1.) Я предполагаю, что ST_Contains (z.boundary, u.location) является хранимой процедурой. Не могли бы вы отредактировать запрос, чтобы прервать это и сделать его видимым для всех нас. 2.) Используйте EXPLAIN, чтобы понять, как оптимизатор обрабатывает ваш запрос. Вы всегда должны использовать EXPLAIN при создании запросов в качестве индексов, которые у вас есть или нет, могут иметь большое значение для производительности. –