2010-08-10 12 views
20

Intento evitar conteo () debido a un problema de rendimiento. (Es decir SELECT COUNT () de los usuarios)Cómo usar MySQL Found_Rows() en PHP?

Si me quedo lo siguiente, en phpMyAdmin, que está bien:

SELECT SQL_CALC_FOUND_ROWS * FROM Users; 
    SELECT FOUND_ROWS(); 

Se volverá # de filas. es decir, # de usuarios.

Sin embargo, si me quedo en en PHP, no puedo hacer esto:

$query = 'SELECT SQL_CALC_FOUND_ROWS * FROM Users; 
    SELECT FOUND_ROWS(); '; 
    mysql_query($query); 

Parece que PHP no les gusta tener dos consultas que pasa en Entonces, ¿cómo puedo hacer eso.?

+4

Eso es lo que llamamos una "optimización prematura" ... –

+0

Por cierto, no se puede enviar 2 consultas usando 'mysql_query() '. Debe enviar cada consulta individualmente. Use otra interfaz de base de datos si desea enviar más de uno a la vez. –

Respuesta

27

SQL_CALC_FOUND_ROWS sólo es útil si usted está utilizando una cláusula LIMIT, pero aún quieren saber cuántas filas hubiera sido encontrados sin la LIMIT.

pensar en cómo funciona esto:

SELECT SQL_CALC_FOUND_ROWS * FROM Users; 

Usted está obligando a la base de datos para recuperar/analizar todos los datos en la tabla, y luego tirarlo a la basura. Incluso si no va a recuperar ninguna de las filas, el servidor de bases de datos aún comenzará a extraer datos reales del disco en el supuesto de que desee esos datos.

En términos humanos, compraste todo el contenido de la súper tienda de abarrotes, pero tiraste todo, excepto el paquete de chicles del estante, por el cajero.

Considerando que, haciendo:

SELECT count(*) FROM users; 

permite que el motor DB sabe que mientras que usted quiere saber cuántas filas hay, no se podía importar menos los datos reales. En la mayoría de los DBMS inteligentes, el motor puede recuperar este conteo de los metadatos de la tabla, o una simple ejecución a través del índice de la clave principal de la tabla, sin tocar los datos de la fila en el disco.

+0

Absolutamente correcto, pero si he agrupado a mis usuarios y quiero contar cuántos grupos hay ahora para paginar por esos grupos? Este es un ejemplo simple, tengo un grupo mucho más complicado en la vida real. – Radamanf

+0

+1 para la analogía. ¡Brillante! – Roger

+0

Tengo una consulta que contiene la cláusula 'limit'. Ahora quiero seleccionar los datos limitados y la cantidad de resultados totales coincidentes usando 'found_rows()'. ¿Cómo? Quiero algo como [esto] (http://stackoverflow.com/questions/33889922/how-to-get-the-number-of-total-results-when-there-is-limit-in-query#33889982) * (esto no funciona) * – Shafizadeh

22

Sus dos consultas:

$query = 'SELECT SQL_CALC_FOUND_ROWS * FROM Users'; 
mysql_query($query); 
$query = 'SELECT FOUND_ROWS()'; 
mysql_query($query); 

PHP sólo puede emitir una sola consulta por llamada mysql_query

0

¿De verdad cree que la selección de todas las filas de mesas es más rápido que contarlos?
Myisam almacena una cantidad de registros en los metadatos de la tabla, por lo que la tabla SELECT COUNT (*) FROM no tiene que acceder a los datos.

5

Es un error común que SQL_CALC_FOUND_ROWS tenga un rendimiento mejor que COUNT(). Ver esta comparación de los chicos Percona: http://www.mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/

contestarle pregunta: Sólo se permite una consulta por una llamada mysql_query, tal como se describe en el manual: mysql_query() sends a unique query (multiple queries are not supported)

consultas múltiples se admiten cuando se utiliza ext/mysqli como su extensión de MySQL:

http://www.php.net/manual/en/mysqli.multi-query.php

3

Uso 'unión' y las columnas vacías:

$sql="(select sql_calc_found_rows tb.*, tb1.title 
     from orders tb 
      left join goods tb1 on tb.goods_id=tb1.id 
     where {$where} 
     order by created desc 
     limit {$offset}, {$page_size}) 
     union 
     (select found_rows(), '', '', '', '', '', '', '', '', '') 
    "; 
$rs=$db->query($sql)->result_array(); 
$total=array_pop($rs); 
$total=$total['id']; 
2

Sólo este código funciona para mí, así que quiero compartirlo para usted.

$Result=mysqli_query($i_link,"SELECT SQL_CALC_FOUND_ROWS id From users LIMIT 10"); 
$NORResult=mysqli_query($i_link,"Select FOUND_ROWS()"); 
$NORRow=mysqli_fetch_array($NORResult); 
$NOR=$NORRow["FOUND_ROWS()"]; 
echo $NOR; 
2

Esta es una manera fácil & funciona para mí:

$query = " 
SELECT SQL_CALC_FOUND_ROWS * 
FROM tb1 
LIMIT 5"; 

$result = mysql_query($query); 

$query = "SELECT FOUND_ROWS() AS count"; 
$result2 = mysql_query($query); 

$row = mysql_fetch_array($result2); 

echo $row['count'];