може бъде най-доброто решение. Нека първо получим някои други отговори...
Какво означава EXPLAIN SELECT ...
казвам? (Това може да отговори на вашия Q2).
Вашето запитване ще сканира цялата таблица, независимо от другите отговори. Може би искате LIMIT ...
на края?
Друго нещо, което може да е полезно (в зависимост от приложението ви и от оптимизатора):Добавете ограничаваща кутия към WHERE
клауза.
Във всеки случай, направете следното, за да получите точна представа за това колко реда всъщност са докоснати:
FLUSH STATUS;
SELECT ...;
SHOW SESSION STATUS LIKE 'Handler%';
Върнете се с тези отговори; тогава може би можем да повторим по-нататък.
След ПОКАЗВАНЕ НА СТАТУСА
Е, Handler_read_rnd_next
казва, че е било пълно сканиране на таблицата. 1000 и 1001 -- имахте ли LIMIT 1000
?
Заключавам, че LIMIT
не се взема предвид в това как SPATIAL
върши работа. Тоест, той прави опростеното нещо -- (1) проверка на всички редове, (2) сортиране, (3) LIMIT
.
И така, какво да правя?
План А:Решете, че не искате резултати по-далеч от X мили (км) и добавете „ограничаваща кутия“ към заявката.
План Б:Изоставете Spatial и копайте по-сложен начин за изпълнение на задачата:http:// mysql.rjweb.org/doc.php/latlng