2010-02-26 11 views
5

Al escribir una consulta para buscar en una página web, ¿cuál es el método menos costoso para obtener un recuento total de filas? ¿Hay alguna forma de hacerlo sin ejecutar una consulta dos veces, una para el total y otra para el límite?¿Cuál es el método menos costoso para obtener un recuento de filas para una consulta SQL?

Usar MySQL

Ejemplo: (me gustaría saber si hay una manera menos costosa)

Consigue Count

SELECT COUNT(*) FROM table 

Obtener Paging

SELECT mycolumns FROM table LIMIT 100 

¿Cómo puedo obtener el recuento total sin ejecutar 2 consultas.

+0

intente contar previamente el tamaño de la tabla y almacenar el valor y ejecutar un proceso en segundo plano para actualizar los valores de tiempo a time –

Respuesta

1

esto le dará una columna adicional llamada Count en cada fila que contiene el número total de filas:

SELECT mycolumns, (select count(*) from table) as Count 
FROM table 
LIMIT 100 
+0

¿Es esto más eficiente que las dos consultas? –

+1

Esto será más eficiente que las consultas por separado, ya que solo realiza una llamada a la base de datos desde su aplicación. – RedFilter

+0

Aunque esta pregunta está marcada con las etiquetas SQL y MySQL, la solución anterior solo funcionará en algunas variantes de SQL, como MySQL. Otras variantes requerirán una cláusula GROUP BY. – asnyder

0

select count (*) de nombredetabla

es la forma más eficiente para obtener el número de filas en la tabla tablename

+3

"¿Hay alguna manera de hacer esto sin ejecutar una consulta dos veces?" – thetaiko

+0

¿por qué tendría que ejecutar esta (o la mía) consulta dos veces? – Jay

+1

Porque uno para el conteo y el segundo para el paginado (límite) para que solo se devuelva x cantidad de filas a la página. Tu problema has visto el 1 | 2 | 3 ... Última al final de las páginas. –

0
select count(1) as counter from *table_name* 

esto es más ligero mejor que usar count(*) como evitando revisar todas las columnas de la tabla.

+0

Buena idea para la primera consulta, pero ¿cómo combino las consultas –

+3

? No hay diferencia entre el recuento (*) y el recuento (1): http://asktom.oracle.com/pls/asktom/f?p=100: 11: 0 :::: P11_QUESTION_ID: 1156159920245 http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1156151916789 –

+0

Esta respuesta al obtener un voto arriba me pone muy triste. Hay tanto material por ahí que demuestra sin lugar a dudas que contar (1) es equivalente a contar (*). No hay razón para que este rumor persista. http://stackoverflow.com/questions/1221559/count-vs-count1 –

4

Puede ejecutar la primera consulta con la opción SQL_CALC_FOUND_ROWS, y luego ejecutar este:

SELECT FOUND_ROWS(); 

http://dev.mysql.com/doc/refman/5.1/en/information-functions.html#function_found-rows

+0

Excelente - ¿Es esto menos costoso que las 2 consultas? –

+0

No puedo garantizar que sea * menos * caro que 2 consultas en todos los casos, pero ciertamente no debe ser * más * caro. La comparación dependerá de muchos factores: motor (es) de almacenamiento, tamaño de la tabla, columnas seleccionadas, cláusula where, índice frente a exploración completa, etc. –

+0

En resumen, si le preocupa el rendimiento, es posible que desee hacer algunas probando con sus datos específicos. –

Cuestiones relacionadas