web-dev-qa-db-fra.com

Comment utiliser MySQL Found_Rows () en PHP?

J'essaie d'éviter de faire Count () en raison d'un problème de performances. (C'est-à-dire SELECT COUNT () FROM Users)

Si j'exécute les éléments suivants dans phpMyAdmin, c'est ok:

  SELECT SQL_CALC_FOUND_ROWS * FROM Users;
  SELECT FOUND_ROWS();

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

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

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

Il semble que PHP n'aime pas passer deux requêtes. Alors, comment faire?

23
murvinlai

SQL_CALC_FOUND_ROWS n'est utile que si vous utilisez une clause LIMIT, mais que vous voulez toujours savoir combien de lignes auraient été trouvées sans LIMIT.

Pensez à comment cela fonctionne:

SELECT SQL_CALC_FOUND_ROWS * FROM Users;

Vous forcez la base de données à récupérer/analyser TOUTES les données de la table, puis vous la jetez. Même si vous ne récupérez aucune des lignes, le serveur de base de données commencera quand même à extraire les données réelles du disque en supposant que vous souhaiterez ces données.

En termes humains, vous avez acheté tout le contenu de la super épicerie, mais vous avez tout jeté, sauf le paquet de gomme sur le stand du caissier.

Attendu qu'en faisant:

SELECT count(*) FROM users;

permet au moteur de base de données de savoir que si vous voulez savoir combien de lignes il y a, vous ne vous souciez pas des données réelles. Sur la plupart des SGBD intelligents, le moteur peut récupérer ce nombre à partir des métadonnées de la table, ou une simple exécution de l'index de clé primaire de la table, sans jamais toucher aux données de ligne sur disque.

28
Marc B

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 qu'une seule requête par appel mysql_query

23
JochenJung

C'est une idée fausse courante, que SQL_CALC_FOUND_ROWS fonctionne mieux que COUNT (). Voir cette comparaison des gars de 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 appel mysql_query, comme décrit dans le manuel: mysql_query() sends a unique query (multiple queries are not supported)

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

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

5
Mchl

Utilisez "union" et 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'];
3
diyism

Ceci est un moyen simple et fonctionne pour moi:

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

$result = mysqli_query($link, $query);

$query = "SELECT FOUND_ROWS() AS count";
$result2 = mysqli_query($link, $query);

$row = mysqli_fetch_array($result2);

echo $row['count'];
3
Amin Adel

Seul ce code fonctionne pour moi, donc je veux le 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;
3
Bagova

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

0
Naktibalda