2010-08-10 11 views
20

J'essaie d'éviter Count () en raison de problèmes de performance. (À savoir SELECT COUNT () des utilisateurs)Comment utiliser MySQL Found_Rows() en PHP?

Si je lance les followings dans phpMyAdmin, il est ok:

SELECT SQL_CALC_FOUND_ROWS * FROM Users; 
    SELECT FOUND_ROWS(); 

Il retournera nombre de lignes. c'est-à-dire le nombre d'utilisateurs.

Cependant, si je cours en PHP, je ne peux pas le faire:

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

Il semble que PHP n'aime pas avoir deux requêtes en passant Alors, comment puis-je faire cela.?

+4

C'est ce que nous appelons une « optimisation prématurée » ... –

+0

Par ailleurs, vous ne pouvez pas envoyer des requêtes à l'aide de 2 'mysql_query() '. Vous devez envoyer chaque requête individuellement. Utilisez une autre interface de base de données si vous voulez en envoyer plusieurs à la fois. –

Répondre

27

SQL_CALC_FOUND_ROWS est utile uniquement si vous utilisez une clause LIMIT, mais veulent toujours savoir combien de lignes aurait été trouvé sans LIMIT.

Pensez comment cela fonctionne:

SELECT SQL_CALC_FOUND_ROWS * FROM Users; 

Vous êtes en train de forcer la base de données pour récupérer/analyser toutes les données de la table, et vous le jeter. Même si vous n'allez pas récupérer les lignes, le serveur de base de données commencera à extraire les données du disque en supposant que vous en aurez besoin. En termes humains, vous avez acheté tout le contenu de la super épicerie, mais vous avez tout jeté à l'exception du paquet de gomme du stand de la caissière.

considérant que, faire:

SELECT count(*) FROM users; 

permet le moteur DB savoir que si vous voulez savoir combien de lignes il y a, vous ne pouviez pas moins de soins sur les données réelles. Sur la plupart des SGBD intelligents, le moteur peut extraire ce compte à partir des métadonnées de la table, ou simplement parcourir l'index de clé primaire de la table, sans jamais toucher aux données de la rangée sur le disque.

+0

Tout à fait raison, mais si j'ai regroupé mes utilisateurs et que je veux compter combien de groupes doivent maintenant paginer par ces groupes? C'est un exemple simple, j'ai un groupe beaucoup plus compliqué dans la vraie vie. – Radamanf

+0

+1 pour l'analogie. Brillant! – Roger

+0

J'ai une requête qui contient la clause 'limit'. Maintenant, je veux sélectionner à la fois les données limitées et le nombre total de résultats correspondants en utilisant 'found_rows()'. Comment? Je veux quelque chose comme [ceci] (http://stackoverflow.com/questions/33889922/how-to-get-the-number-of-total-results-when-there-is-limit-in-query#33889982) * (cela ne fonctionne pas) * – Shafizadeh

22

Ses deux requêtes:

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

PHP ne peut émettre une seule requête par mysql_query appel

0

Pensez-vous vraiment que la sélection toutes les lignes de tables est plus rapide que les compter?
Myisam stocke un certain nombre d'enregistrements dans les métadonnées de la table, de sorte que SELECT COUNT (*) FROM table n'a pas besoin d'accéder aux données.

5

C'est une idée fausse commune, que SQL_CALC_FOUND_ROWS fonctionne mieux que COUNT(). Voir cette comparaison de gars Percona: http://www.mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/

Pour répondre à votre question: Une seule requête est autorisée par un appel mysql_query, comme décrit dans le manuel: mysql_query() sends a unique query (multiple queries are not supported)

requêtes multiples sont pris en charge lors de l'utilisation ext/mysqli comme extension MySQL:

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

3

« union » utilisation et les colonnes vides:

$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

Seul ce code fonctionne pour moi, donc je veux partager pour vous.

$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

Ceci est un moyen facile & fonctionne pour moi:

$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'];