Überprüfen Sie, ob der MySQL-Tabelle leer ist: COUNT(*) ist null vs. LIMIT(0,1) hat ein Ergebnis?
Dies ist eine einfache Frage nach Effizienz speziell im Zusammenhang mit der MySQL-Implementierung. Ich will nur überprüfen, ob eine Tabelle leer ist (und wenn es leer ist, füllen Sie es mit der Standard-Daten). Wäre es am besten, verwenden Sie eine Anweisung wie SELECT COUNT(*) FROM `table`
zu vergleichen und dann zu 0, oder wäre es besser zu tun, eine Aussage wie SELECT `id` FROM `table` LIMIT 0,1
dann überprüfen, wenn keine Ergebnisse zurückgegeben wurden (die Ergebnismenge hat Folgendes)?
Obwohl ich brauche diese für ein Projekt an dem ich arbeite, bin ich auch daran interessiert, wie MySQL funktioniert mit diesen beiden Aussagen, und ob der Grund die Leute scheinen zu empfehlen COUNT(*)
ist, weil das Ergebnis zwischengespeichert wird oder ob es tatsächlich durchläuft jede Zeile und fügt eine Zählung, wie es intuitiv scheint mir.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie auf jeden Fall gehen Sie mit der zweiten Abfrage, anstatt den ersten.
Bei der Verwendung
COUNT(*)
-, MySQL-überprüfung ist mindestens ein index und zählen der Datensätze. Auch wenn Sie einhüllen würde der Aufruf in derLEAST()
(SELECT LEAST(COUNT(*), 1) FROM table;
) oder eineIF()
wird MySQL vollständig zu bewertenCOUNT()
vor der Auswertung weiter. Ich glaube nicht, dass MySQL speichert dieCOUNT(*)
Ergebnis, wenn InnoDB verwendet wird.Ihrer zweiten Abfrage die Ergebnisse in nur einer Zeile gelesen wird, ferner ein index verwendet wird (vorausgesetzt, id ist ein Teil von einem). Schauen Sie in die Dokumentation des Treibers, um herauszufinden, wie Sie überprüfen, ob alle Zeilen zurückgegeben wurden.
Durch die Art und Weise, die
id
Feld kann ausgelassen werden, aus der Abfrage (MySQL wird ein beliebiger index):Aber ich denke, die einfachste und am meisten performante Lösung ist folgende (wie in Gordon ' s Antwort):
EXISTS
zurück1
wenn die Unterabfrage gibt alle Zeilen, sonst0
. Aufgrund dieser semantischen MySQL optimieren die Ausführung richtig.Alle Felder aufgelistet, die in der Unterabfrage werden ignoriert, so
1
oder*
ist allgemein geschrieben.Sehen die MySQL-Handbuch für weitere Informationen über die
EXISTS
Schlüsselwort und seine Verwendung.Ist es besser die zweite Methode, oder einfach nur
exists
. Insbesondere, so etwas wie:sollte der Schnellste Weg, das zu tun, was Sie wollen. Sie brauchen nicht die
limit
; die SQL-engine kümmert sich für Sie.Durch die Art und Weise, nie-IDS (Tabellen-und Spaltennamen) in einfache Anführungszeichen gesetzt werden.
SELECT NULL FROM table LIMIT 1
zu vermeiden, tatsächlich zu Lesen, die Informationen aus der Tabelle.if exists (select id from table)
code funktioniert nicht bei allen (MySQL 5.7.17)/* SQL Error (1064): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'if exists (select ticker from wp_assets_portfolio_sessions_data)' at line 1 */