2010-03-18 14 views
5

Duplicar posible:
Which is faster/best? SELECT * or SELECT column1, colum2, column3, etc.* en la consulta SELECT

Actualmente estoy portar una aplicación escrita en PHP 4 y MySQL3 a MySQL5 y PHP5.

En el análisis encontré varias consultas SQL que usan "select * from tablename" incluso si solo se procesa una columna (campo) en PHP. La tabla tiene casi 60 columnas y tiene una clave principal. En la mayoría de los casos, la única columna utilizada es id, que es la clave principal.

¿Habrá algún aumento en el rendimiento si utilizo consultas en las que los nombres de las columnas se mencionan explícitamente en lugar de *? (En esta aplicación sólo hay un método que necesitamos todas las columnas y todos los demás métodos devuelven sólo un subconjunto de las columnas)

Respuesta

10

En general, se considera buena práctica buscar solo lo que se necesita. Especialmente si el servidor de la base de datos no está en la misma máquina, buscar una fila entera dará lugar a consultas más lentas, porque hay más datos para transportar a través de la red a la máquina consumidora. Entonces, si una fila completa equivale a 100k de datos y solo necesita la ID, que es mucho menos, obtendrá resultados más rápidos, por supuesto.

Como consejo general para la optimización de consultas, use el EXPLAIN statement para ver cuán costosa será una consulta.

+1

Creo que tu respuesta es la mejor hasta el momento – ant

2

Habrá alguna mejora en el rendimiento si que utilizar consultas en el que los nombres de columna se mencionan explícitamente en su lugar de *? -

1

Sí. Si está buscando más datos de los que necesita, debe leerlos desde el disco, transferirlos entre MySQL y PHP, etc., lo que probablemente demorará más.

+0

SELECT * 'se optimiza, pero estás en lo correcto acerca de ir a buscar solamente las columnas que necesita. –

1

Si y cuánto se beneficia depende del caso, pero al menos para los casos en que solo necesita la columna de identificación, debe corregir el SQL.

Además del tráfico reducido de la red (de envío de datos inútiles), la base de datos puede acceder a las pocas columnas que necesita simplemente utilizando índices, sin acceder a la tabla en absoluto. Eso aceleraría las cosas mucho.

El único inconveniente posible es el aumento en el número de declaraciones SQL distintas que el servidor debe procesar (y un código más complejo en su extremo).

1

No - habrá un impacto en el rendimiento, pero mientras no haya BLOB/CLOB en el esquema será insignificante (a menos que acceda a su base de datos en un módem de 300 baudios) - la mayor parte del trabajo realizado por la base de datos está en la identificación de las filas que coincidan con la cláusula WHERE - sin embargo, su (en mi humilde opinión) mala práctica de programación para utilizar SELECT *

C.

4

"la optimización prematura es la raíz del todo mal". Donald Knuth.

Nunca haga una pregunta como Will there be any performance boost?. Pero solo haga una pregunta como "Tengo cierto cuello de botella. ¿Cómo puedo eliminarlo?"

En el 99% de nuestras aplicaciones, esta 'mejora' sería irrlelvant. Como muchas otras mejoras, sobre la base de los sueños, no en los de perfiles y necesidades reales.

+1

Lo siento, pero no puedo estar de acuerdo. La optimización prematura es un mal argumento para no especificar los campos que desea. Es una excusa para la pereza, es lo que es. –

1

Sí. Fetch solamente . las columnas que se requieren no sólo puede mejorar el rendimiento, pero para evitar que su código se rompa inadvertidamente Considere la siguiente consulta:.

SELECT * desde Taba JOIN Tabb en ... ORDER BY COLX

Preguntan si funciona hoy en día cuando solo tabA tiene colX, pero si cambia el esquema y agrega colX a tabB, la consulta terminará de forma anómala.

Por supuesto, el uso de alias de tablas para todos los campos también ayudará a evitar roturas.

-Krip

Cuestiones relacionadas