2012-01-13 14 views
5

Tengo una mesa bastante grande con más de 150,000 registros. Tiene muchos campos como country_id, region_id, city_id, latitude, longitude, postal_code, por nombrar solo algunos.¿Añadir más especificidad a una consulta SELECT lo haría más rápido?

Necesito seleccionar de esta tabla en función de la latitud y la longitud, nada más. Mi consulta es el siguiente:

SELECT * FROM `mytable` 
    WHERE `latitude` = '$latitude' 
    AND `longitude` = '$longitude'; 

Ahora bien, aunque mi único criterio para la selección de esta tabla es la latitud/longitud Me preguntaba si la adición de más especificidad aceleraría la consulta como:

SELECT * FROM `mytable` 
    WHERE `city_id` = '320' 
    AND `latitude` = '$latitude' 
    AND `longitude` = '$longitude'; 

Parece contra Es intuitivo para mí que agregar más condiciones a la consulta lo aceleraría, pero al mismo tiempo reduciré el número de resultados posibles por un amplio margen al asegurarme primero de que todos los registros seleccionados provienen de un ID de ciudad particular que sé que reside en el rango de latitud y longitud que voy a especificar para el próximo.

Puede haber alrededor de 150k de registros totales, pero solo alrededor de 10k desde esa ciudad en particular.

¿Es esto sensato en absoluto o solo estoy haciendo que la consulta lleve más tiempo?

Respuesta

6

En general, agregar condiciones a una cláusula WHERE en su consulta no tendrá mucho impacto en el tiempo de ejecución. Sin embargo, si agrega índices a los campos mencionados en su cláusula WHERE, puede mejorar considerablemente el rendimiento.

Por lo tanto, en su ejemplo, si no hay un índice en city_id y debía agregar esa condición a su cláusula WHERE y crear un índice en ese campo, es probable que observe una mejora considerable en el rendimiento.

+0

Un poco confundido desde que dijiste que agregar condiciones en la cláusula where generalmente no tiene mucho impacto en la velocidad, y luego dices que si indico los 3 campos mencionados en la cláusula where obtendré un considerable mejora en el rendimiento. Entonces, para aclarar qué recomiendas (suponiendo que los 3 campos tengan índices). ¿Debo agregar el city_id = 'lo que sea' adicional antes de las otras 2 condiciones o no? – user1128811

+0

@ user1128811 - en general, cada vez que incluyo un campo en una condición en una cláusula WHERE (o un JOIN para ese asunto), me aseguro de que el campo esté adecuadamente indexado. De esta forma, me aseguro de que el servidor de la base de datos escanee el índice (pequeño) en lugar de la tabla (grande) para eliminar registros del conjunto de resultados. En términos de qué orden debe poner las condiciones, esta es una tarea que se puede contemplar con un optimizador o analizador de consultas. –

2

Agregar criterios podría ir de cualquier manera, pero generalmente más criterios ayudan al rendimiento, especialmente si las columnas tienen índices.

En su caso, si tiene un índice que incluye city_id y long y lat obtendrá un mejor rendimiento.

Cuestiones relacionadas