Il massimo a livello di gruppo non è garantito per funzionare. In effetti, MariaDB l'ha rotto, ma ha fornito un'impostazione per riaverlo. Questo è ciò a cui mi riferisco:
SELECT *
FROM
( SELECT ... ORDER BY ... )
GROUP BY ...
dove vuoi il primo (o l'ultimo) in ogni gruppo dalla query interna. Il problema è che SQL è libero di ottimizzare tale intento.
Il codice massimo di gruppo nei documenti è terribilmente inefficiente.
Per velocizzare la query, un probabile aiuto è isolare le Rules
o Places
parte della clausola WHERE e trasformarla in una sottoquery che restituisce solo la CHIAVE PRIMARIA della tabella corrispondente. Quindi inseriscilo in un JOIN con tutte le tabelle (incluso un JOIN sullo stesso tavolo). Hai già un "indice di copertura" per quella sottoquery in modo che possa essere "Uso dell'indice" (nel gergo usato da EXPLAIN).
innodb_buffer_pool_size è impostato su circa il 70% della RAM disponibile?
BIGINT occupa 8 byte; probabilmente potresti vivere con MEDIUMINT UNSIGNED (0..16M). Più piccolo --> più memorizzabile nella cache --> meno I/O --> più veloce.
La coppia di DOUBLE per lat/lng occupa 16 byte. Una coppia FLOAT richiederebbe 8 byte e avrebbe una risoluzione di 6 piedi / 2 m. Oppure DECIMAL(6,4) per latitudine e (7,4) per longitudine per 7 byte e una risoluzione di 52 piedi / 16 m. Abbastanza buono per i "negozi", soprattutto perché stai usando un "quadrato" invece di un "cerchio" per la distanza.
Il codice per "trova il più vicino..." è difficile da ottimizzare. Ecco il meglio che ho trovato:http://mysql.rjweb.org/doc .php/latlng