Pregunta

¿Hay una diferencia apreciable entre el rendimiento que tiene una consulta que devuelve SELECT foo, bar, FROM users 500 filas y 500 consultas SELECT foo, bar, FROM users WHERE id = x próximos a la vez?

En una aplicación PHP que estoy escribiendo, estoy tratando de elegir entre una sección legible escritura clara, de código que produciría alrededor de 500 sentencias SELECT; o escribir una que de una manera oscura, compleja que utilizaría sólo un SELECT que devuelve 500 filas.

Yo prefiero la forma en que utiliza código claro, fácil de mantener, pero me preocupa que la sobrecarga de conexión para cada uno de los SELECT causará problemas de rendimiento.

Información de Antecedentes, en caso de que sea relevante: 1) Este es un módulo Drupal, codificado en PHP 2) Las tablas en cuestión se ponen muy pocas inserciones y actualizaciones, y rara vez se bloquean 3) las uniones SQL no son posibles por razones no relacionadas con la cuestión

Gracias!

¿Fue útil?

Solución

Es casi siempre más rápido que hacer una gran tanda SELECT y analizar los resultados en el código de aplicación que no hacer una enorme cantidad de SELECTs para una fila. Yo recomendaría que implemente tanto y el perfil de ellos, sin embargo. Siempre se esfuerzan por reducir al mínimo el número de supuestos que tiene que hacer.

Otros consejos

Yo no preocuparse por la sobrecarga de la conexión de consultas MySQL demasiado, especialmente si no está cerrando la conexión entre cada consulta. Tenga en cuenta que si su consulta crea una tabla temporal, que ya ha pasado más tiempo en la consulta de la sobrecarga de la consulta tardó.

Me encanta hacer una consulta SQL compleja, en lo personal, pero he encontrado que el tamaño de las tablas, caché de consultas MySQL y rendimiento de las consultas de consultas que se necesita hacer la verificación del rango (incluso en contra de un índice) todos hacen una diferencia.

Le sugiero esto:

1) establecer la línea de base sencilla, correcta. Sospecho que este es el enfoque trillón-consulta. Esto no es malo, y muy probablemente helfully correcta. Ejecutar un par de veces y ver su caché de consultas y rendimiento de las aplicaciones. La capacidad de mantener su mantenible aplicación es muy importante, sobre todo si se trabaja con otros mantenedores de código. Además, si usted está consultando las tablas muy grandes, pequeños consultas mantendrán escalabilidad.

2) Código de la consulta compleja. Comparar los resultados de la precisión, y luego el tiempo. A continuación, utilice el esperado en la consulta para ver lo que las filas son escaneados. He encontrado a menudo que si tengo un JOIN o! WHERE x = y, o una condición que crea una tabla temporal, el rendimiento de la consulta podría ser un problema serio, especialmente si estoy en una mesa que siempre está siendo actualizado. Sin embargo, también me he dado cuenta que una consulta compleja podría no ser correcta, y también que una consulta compleja puede romper más fácilmente como una aplicación crece. Las consultas complejas típicamente escanean grandes conjuntos de filas, a menudo la creación de tablas temporales e invocan exploraciones using where. Cuanto mayor sea la tabla, el más caro éstos consiguen. Además, es posible que tenga consideraciones del equipo donde las consultas complejas no se adaptan a las fortalezas de su equipo.

3) compartir los resultados con su equipo.

Las consultas complejas son menos propensos a golpear la caché de consultas MySQL, y si son lo suficientemente grandes, no hacen caché de ellos. (Usted desea guardar la caché de consultas MySQL para golpear con frecuencia consultas.) Además, la consulta donde los predicados que tienen que escanear el índice no va a hacer así. (X! = Y, x> y, x SELECT foo, bar FROM users WHERE foo != 'g' and mumble < '360' terminan haciendo exploraciones. (El coste de los gastos generales consulta podría ser insignificante en ese caso.)

consultas pequeñas pueden a menudo completa sin crear tablas temporales sólo por conseguir todos los valores del índice, siempre que los campos que está seleccionando y fundamentación de están indexados. Por lo que el rendimiento de las consultas de SELECT foo, bar FROM users WHERE id = x es realmente grande (especialmente si foo columnas y bar se indexan como, también conocido como alter table users add index ix_a ( foo, bar );.)

Otras buenas maneras de aumentar el rendimiento en su aplicación sería para almacenar en caché los pequeños resultados de la consulta en la aplicación (en su caso), o haciendo trabajos por lotes de una consulta vista materializada. Además, consideran memcached o algunas de las características encontradas en XCache.

Parece que usted sabe cuáles son los 500 valores id son, ¿por qué no hacer algo como esto:

// Assuming you have already validated that this array contains only integers
// so there is not risk of SQl injection

$ids = join(',' $arrayOfIds);

$sql = "SELECT `foo`, `bar` FROM `users` WHERE `id` IN ($ids)";
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top