O groupwise max não é garantido que funcione. Na verdade, o MariaDB o quebrou, mas forneceu uma configuração para recuperá-lo. É a isso que me refiro:
SELECT *
FROM
( SELECT ... ORDER BY ... )
GROUP BY ...
onde você deseja o primeiro (ou último) em cada grupo da consulta interna. O problema é que o SQL é livre para otimizar essa intenção.
O código groupwise max nos documentos é terrivelmente ineficiente.
Para acelerar a consulta, uma ajuda provável é isolar as
Rules
ou Places
parte da cláusula WHERE e transformá-la em uma subconsulta que retorna apenas a PRIMARY KEY da tabela correspondente. Em seguida, coloque isso em um JOIN com todas as tabelas (incluindo um JOIN de volta para a mesma tabela). Você já tem um "índice de cobertura" para essa subconsulta para que possa ser "Usando índice" (no jargão usado por EXPLAIN). O innodb_buffer_pool_size está definido para cerca de 70% da RAM disponível?
BIGINT leva 8 bytes; você provavelmente poderia viver com MEDIUMINT UNSIGNED (0..16M). Menor --> mais armazenável em cache --> menos E/S --> mais rápido.
O par de DOUBLEs para lat/lng ocupa 16 bytes. Um par FLOAT levaria 8 bytes e teria resolução de 6 pés / 2m. Ou DECIMAL(6,4) para latitude e (7,4) para longitude para 7 bytes e uma resolução de 52 pés / 16m. Bom o suficiente para "lojas", especialmente porque você está usando um 'quadrado' em vez de um 'círculo' para distância.
Código para "encontrar o mais próximo ..." é difícil de otimizar. Aqui está o melhor que encontrei:http://mysql.rjweb.org/doc .php/latlng