A pergunta:
EXPLAIN EXTENDED
SELECT *, u.user_id
FROM xgate_geoloc g
JOIN tig_users u
ON g.uid = u.uid
WHERE
-- corners selection:
( ( (lat BETWEEN COALESCE(?, lat) and COALESCE(?, lat))
AND (lat NOT BETWEEN COALESCE(?, lat) and COALESCE(?, lat))
)
OR ( (lon BETWEEN COALESCE(?, lon) and COALESCE(?, lon))
AND (lon NOT BETWEEN COALESCE(?, lon) and COALESCE(?, lon))
)
)
AND sex = COALESCE(?, sex)
AND language = COALESCE(?, language)
AND city = COALESCE(?, city)
AND province = COALESCE(?, province)
AND country = COALESCE(?, country)
AND time BETWEEN COALESCE(?, time) and COALESCE(?, time)
ORDER BY time DESC
- esse "OR" na expressão where tem algum efeito no índice que devo usar?
- O campo 'time' é usado em where e order by. Qualquer maneira de forjar um índice neste cenário?
- ordem por tempo desc - ordem decrescente; mais uma chatice
Obrigado pela contribuição!
O OR provavelmente afetará o uso do índice, porque dificulta a busca do índice. De um modo geral, "OR" é 'ruim' para uso de índice em cláusulas where.
O campo de tempo, seria sensato tê-lo em um índice classificado na ordem DESC quando você usá-lo DESC;
Fora isso - precisaremos de mais informações para dar conselhos mais exatos/concretos
Acho que o problema de impedir que um índice
time
seja usado para filtragem é o uso de uma função com referência à linha:COALESCE(?, time)
.Eu suspeito que o planejador de consulta do mysql não está sendo brilhante o suficiente para simplificar
time BETWEEN COALESCE(?, time) and COALESCE(?, time)
quandotime BETWEEN <?1> AND <?1>
ambos os parâmetros relevantes não são NULL e quando um é NULL para simplificarCOALESCE(?, time)
quandotime
o parâmetro apropriado é NULL e depois simplificar ainda maistime BETWEEN time AND <something>
paratime < <something>
outime BETWEEN <something> AND time
paratime < <something>
Tente ter consultas preparadas separadas para cada caso (ambos os tempos sabem, o início NULL, o fim NULL e ambos NULL) em vez de tentar fazer tudo em um para dar ao planejador de consultas um tempo mais fácil nessa parte.