Det gruppevise max er ikke garanteret at virke. Faktisk brød MariaDB den, men gav en indstilling til at få den tilbage. Dette er, hvad jeg henviser til:
SELECT *
FROM
( SELECT ... ORDER BY ... )
GROUP BY ...
hvor du vil have den første (eller sidste) i hver gruppe fra den indre forespørgsel. Problemet er, at SQL frit kan optimere denne hensigt.
Den gruppevise max-kode i dokumenterne er frygtelig ineffektiv.
For at fremskynde forespørgslen er en sandsynlig smule hjælp at isolere Rules
eller Places
del af WHERE-sætningen og gør det til en underforespørgsel, som kun returnerer PRIMARY KEY i den tilsvarende tabel. Sæt det derefter i en JOIN med alle tabellerne (inklusive en JOIN tilbage til den samme tabel). Du har allerede et "dækkende indeks" for den underforespørgsel, så det kan være "Brug af indeks" (i den jargon, der bruges af EXPLAIN).
Er innodb_buffer_pool_size indstillet til omkring 70 % af tilgængelig RAM?
BIGINT tager 8 bytes; du kunne sikkert leve med MEDIUMINT UNSIGNED (0..16M). Mindre --> mere cacheable --> mindre I/O --> hurtigere.
Parret af DOUBLE for lat/lng tager 16 bytes. Et FLOAT-par ville tage 8 bytes og have en opløsning på 6 fod/2m. Eller DECIMAL(6,4) for breddegrad og (7,4) for længdegrad for 7 bytes og en opløsning på 52 fod/16 m. Godt nok til "butikker", især da du bruger en "firkant" i stedet for en "cirkel" til afstand.
Koden for "find den nærmeste ..." er svær at optimere. Her er det bedste, jeg har fundet på:http://mysql.rjweb.org/doc .php/latlng