Opciones:
-
Incorpore la ordenación dentro de su lógica/definición de procedimiento almacenado. Si su llamada SQL selecciona dentro de su procedimiento almacenado, realice la ordenación y el límite allí . - Esto significa que no producirá 10 000 filas en el procedimiento almacenado, solo para recurrir a ellas. Además, si la tabla tiene índices, la clasificación original dentro de SQL select puede ser mucho más rápida.
-
Verifique que se utilice la indexación dentro de su tabla. - Los índices harán que sus clasificaciones se realicen más rápido al seleccionar en la tabla.
Indíquenos la definición de la función, sería más fácil ayudarlo adicionalmente.
Finalmente, intente mover su pedido y limitarlo directamente dentro de su función en lugar de hacerlo más tarde. Su función puede devolver los 10 resultados directamente ordenados y listos. Si lo desea, cree dos funciones:una que devuelva los resultados completos y otra que los devuelva limitados y ordenados.
Actualizar:
Después de ver su función, se hace evidente que está tratando de ordenar por un valor calculado. Ordenar por valores calculados es extremadamente lento como también se menciona en:
- https://stackoverflow.com/a/3401611/1688441
- Rendimiento de MySQL al ordenar en una columna calculada
Estoy tratando de pensar cómo podría "preprocesar/ordenar" sus datos en función de col1 o col2 para acelerar el orden final de sus resultados. Si col1 y col2 son columnas de la tabla, y funResult es una función matemática que se puede graficar, una de las dos tiene un mayor efecto en el valor de retorno de la función....
Finalmente, si col1 y col2 son columnas de myTable, no necesita usar una función almacenada pero podría consultar, pero esto no haría una gran diferencia... Su principal problema es ordenar por una función calculada:
SELECT rowId, ((col1-INPUT_CONST)*2)+(col2*3) AS funResult
FROM myTable
ORDER BY funResult DESC
LIMIT 10
Actualización 2:
Después de buscar el problema de clasificar la distancia calculada, descubrí que esto se ha preguntado y resuelto de manera muy eficiente en el siguiente enlace. En relación con la clasificación por un valor calculado, la clasificación por un valor calculado es inherentemente lenta. Consulte los dos enlaces siguientes para obtener ayuda adicional:
- http://www.mooreds.com/wordpress/archives/547 - "Optimización de un cálculo de distancia en una consulta mysql"
- La Manera Más Rápida para encontrar la distancia entre dos puntos de latitud/longitud .
Finalmente, lo más parecido a su respuesta es esto: https://stackoverflow.com/a/4180065/1688441