Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Otimizando o MySQL ORDER BY em um cálculo compartilhado com WHERE


Não, o cálculo não será realizado duas vezes se for escrito exatamente da mesma forma. No entanto, se o seu objetivo é melhorar o desempenho do seu aplicativo, você pode querer olhar para o quadro geral, em vez de se concentrar neste pequeno detalhe que pode lhe dar no máximo um fator de duas diferenças. Um problema mais sério é que sua consulta impede o uso eficiente de índices e resultará em uma verificação completa.

Eu recomendaria que você alterasse seu banco de dados para usar o tipo de geometria e criar um índice espacial em seus dados. Então você pode usar MBRWithin para encontrar rapidamente os pontos que estão dentro da caixa delimitadora do seu círculo. Depois de encontrar esses pontos, você pode executar seu teste de distância mais caro apenas nesses pontos. Essa abordagem será significativamente mais rápida se sua tabela for grande e uma pesquisa típica retornar apenas uma pequena fração das linhas.

Se você não puder alterar o modelo de dados, ainda poderá melhorar o desempenho usando uma verificação de caixa delimitadora primeiro, por exemplo WHERE x BETWEEN 10 AND 20 AND y BETWEEN 50 AND 60 . A caixa delimitadora poderá usar um índice, mas como os índices R-Tree só são suportados no tipo de geometria você terá que usar o índice B-Tree padrão que não é tão eficiente para este tipo de consulta (mas ainda muito melhor do que o que você está fazendo atualmente).