Opções:
-
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.
-
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:
- http://www.mooreds.com/wordpress/archives/547 - "Otimizando um cálculo de distância em uma consulta mysql"
- Maneira mais rápida para encontrar a distância entre dois pontos de latitude/longitude .
Finalmente, o mais próximo da sua resposta é: https://stackoverflow.com/a/4180065/1688441