2010-08-10 6 views
20

Ich versuche, Count () wegen Leistungsproblem zu vermeiden. (Das heißt SELECT COUNT () FROM Benutzer)Wie verwende ich MySQL Found_Rows() in PHP?

Wenn ich die folgenden in phpMyAdmin laufen, ist es ok:

SELECT SQL_CALC_FOUND_ROWS * FROM Users; 
    SELECT FOUND_ROWS(); 

Es Anzahl der Zeilen zurück. d.h. Anzahl der Benutzer.

Allerdings, wenn ich in PHP laufe in, ich kann das nicht tun:

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

Es ist wie PHP scheint nicht wie zwei Abfragen im Vorbeigehen haben Also, wie kann ich das tun.?

+4

Das ist, was wir eine "vorzeitige Optimierung" nennen ... –

+0

By the way, können Sie nicht mehr als 2 Anfragen senden mit 'mysql_query() '. Sie müssen jede Abfrage einzeln senden. Verwenden Sie eine andere Datenbankschnittstelle, wenn Sie mehrere gleichzeitig senden möchten. –

Antwort

27

SQL_CALC_FOUND_ROWS ist nur dann sinnvoll, wenn Sie eine LIMIT Klausel verwenden, aber immer noch wollen wissen, wie viele Zeilen ohnegefunden worden, hätte.

denke daran, wie das funktioniert:

SELECT SQL_CALC_FOUND_ROWS * FROM Users; 

Sie zwingen die Datenbank abzurufen/analysieren alle Daten in der Tabelle, und du es dann wegwerfen. Selbst wenn Sie keine der Zeilen abrufen, beginnt der DB-Server dennoch, tatsächliche Daten von der Festplatte zu ziehen, unter der Annahme, dass Sie diese Daten möchten.

In den menschlichen Begriffen, Sie kauften den gesamten Inhalt des Supermarktes, aber warf alles außer der Packung Kaugummi aus dem Stand von der Kasse.

Ange tun:

SELECT count(*) FROM users; 

lässt den Motor DB wissen, dass, während Sie wollen wissen, wie viele Zeilen gibt es nicht weniger über die tatsächlichen Daten kümmern könnte. Bei den meisten intelligenten DBMS kann die Engine diese Anzahl aus den Metadaten der Tabelle abrufen oder einfach durch den Primärschlüsselindex der Tabelle laufen, ohne jemals die Zeilendaten auf der Festplatte zu berühren.

+0

Absolut richtig, aber wenn ich meine Benutzer gruppiert habe und zählen möchte, wie viele Gruppen nun von diesen Gruppen paginieren sollen? Dies ist ein einfaches Beispiel, ich habe eine viel kompliziertere Gruppe im wirklichen Leben. – Radamanf

+0

+1 für die Analogie. Brillant! – Roger

+0

Ich habe eine Abfrage mit der Klausel 'limit'. Jetzt möchte ich sowohl limitierte Daten als auch die Anzahl der insgesamt übereinstimmenden Ergebnisse mit 'found_rows()' auswählen. Wie? Ich möchte etwas wie [das] (http://stackoverflow.com/questions/33889922/how-to-get-the-number-of-total-results-when-there-is-limit-in-query#33889982) * (das geht nicht) * – Shafizadeh

22

Seine zwei Anfragen:

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

PHP nur eine einzige Abfrage pro mysql_query Anruf

0

Glauben Sie wirklich, dass die Auswahl alle Zeilen aus Tabellen schneller ausgeben kann sie als zu zählen?
Myisam speichert eine Reihe von Datensätzen in den Metadaten der Tabelle, sodass SELECT COUNT (*) FROM Tabelle nicht auf Daten zugreifen muss.

5

Es ist ein häufiges Missverständnis, dass SQL_CALC_FOUND_ROWS besser als COUNT() funktioniert. Sehen Sie diesen Vergleich von Percona Jungs: http://www.mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/

beantworten Sie die Frage: Nur eine Abfrage pro mysql_query Anruf erlaubt ist, wie in Handbuch beschrieben: mysql_query() sends a unique query (multiple queries are not supported)

Mehrere Abfragen werden unterstützt, wenn ext/mysqli als MySQL-Erweiterung mit:

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

3

Use ‚Vereinigung‘ und leere Spalten:

$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

Nur dieser Code funktioniert für mich so will ich es für Sie teilen.

$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

dies eine einfache Möglichkeit ist & funktioniert bei mir:

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