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

MySQL Query Slow ao usar Order By com função para calcular a distância entre dois pontos (long, lat)

Opções:


  1. Incorpore a classificação em sua definição/lógica de procedimento armazenado. Se o seu SQL de chamada selecionar dentro do seu procedimento armazenado, execute a classificação e limite lá . - Isso significa que você não estará produzindo 10.000 linhas no procedimento armazenado, apenas para reutilizá-las. Além disso, se a tabela tiver índices, a classificação original no SQL select pode ser muito mais rápida.

  2. Verifique se a indexação é usada em sua tabela. - Os índices farão com que suas ordenações sejam executadas mais rapidamente ao selecionar na mesa.

Forneça a definição da função, será mais fácil ajudá-lo.

Por fim, tente mover seu pedido e limite diretamente dentro de sua função, em vez de fazê-lo mais tarde. Sua função pode retornar os 10 resultados diretamente ordenados e prontos. Se desejar, faça duas funções - uma que retorne os resultados completos e outra que os retorne limitados e ordenados.

Atualização:


Depois de ver sua função, fica claro que você está tentando ordenar por um valor calculado. A ordenação por valores calculados é extremamente lenta, como também mencionado em:

Estou tentando pensar em como você poderia "pré-processar/ordenar" seus dados com base em col1 ou col2 para acelerar a ordenação final de seus resultados. Se col1 e col2 são colunas da tabela e funResult é uma função matemática que pode ser representada graficamente, uma das duas tem um efeito maior no valor de retorno da função....

Finalmente, se col1 e col2 são colunas de myTable, você não precisa usar uma função armazenada, mas pode consultar, mas isso não faria uma grande diferença... Seu principal problema é ordenar por uma função calculada:
SELECT rowId, ((col1-INPUT_CONST)*2)+(col2*3) AS funResult
FROM myTable
ORDER BY funResult DESC
LIMIT 10

Atualização 2:


Depois de cavar para o problema da ordenação ser calculada a distância descobri que isso já foi perguntado e resolvido de forma muito eficiente no link abaixo. Em relação à classificação por um valor calculado, como sua classificação por um valor calculado é inerentemente lenta. Consulte os dois links a seguir para obter ajuda adicional:

Finalmente, o mais próximo da sua resposta é: https://stackoverflow.com/a/4180065/1688441