Grenze vs existiert gegen Anzahl (*) vs Anzahl (ID) in MySQL

8

Ich möchte nur wissen, welcher der schnellste ist.

Was ich versuche, ist nur zu überprüfen, ob die Daten in der Tabelle vorhanden sind. Ich habe die meiste Zeit "LIMIT" benutzt, aber Ihrer Meinung nach oder wenn Sie eine Basis haben, welche ist am schnellsten zu überprüfen, ob Daten vorhanden sind.

Beispiel:

Grenze 1:

%Vor%

existiert:

%Vor%

zählen (*):

%Vor%

Anzahl (ID):

%Vor%

Zusätzlich: Ich verwende InnoDB.

    
Echusen 15.11.2013, 09:27
quelle

2 Antworten

13

Limit ist immer am schnellsten, weil es eine Zeile der Tabelle iteriert.

Exists hat wenig Unterschied zu Limit, weil Sie einfach eine andere select-Anweisung hinzufügen, wir können sagen, dass sie dieselbe Effizienz wie die erste hat.

Count iteriert die gesamte Tabelle und zählt das Ergebnis. Wenn Sie count () verwenden, zählt mysql standardmäßig den Primärschlüssel der Tabelle. Ich habe einige Tests von count (id), count (), count (Feld) und count (1) in großen Tabelle gemacht, es gibt keinen großen Unterschied. Meiner Meinung nach wird 'count' immer versuchen, den Index zu zählen, es sei denn, das von Ihnen gezählte Feld ist kein Index, aber viele Leute sagten, dass wir count (id) verwenden sollten anstatt count (*).

In einer kleinen Tabelle funktionieren die vier Wege alle gut. Aber wenn du dich mit einem großen Tisch verbindest, wird das Zählen sehr lange dauern.

Die verwendete Zeit ist also count (*) & gt; Zählung (id) & gt; & gt; existiert & gt; limitieren

    
user2208436 15.11.2013, 10:20
quelle
0

Ich denke, es geht ihnen allen gut; außer ich würde die WHERE ID = 1 -Klauseln entfernen. Wenn Sie jemals Ihren Tisch leeren und mit dem Wiedereinsetzen beginnen, wird ID 1 nicht existieren. Nur LIMIT 1 wird den Trick machen. Ich persönlich bevorzuge die Optionen exists und count(*) nicht. Ich würde dann count(ID) bevorzugen, da Sie normalerweise einen Index für ID hätten, also würde ich erwarten, dass das ziemlich schnell läuft. Um sicher zu sein, müsste man sie (an einem wirklich großen Tisch) zeitlich abwarten - ich erwarte, dass sie etwas wie exists , limit 1 , count(id) , count(*) vom schnellsten zum langsamsten herauskommen. (Ich zweifle jedoch an der exists - wenn es tatsächlich die ganze SELECT * auswertet, kann es am schlimmsten ausfallen).

    
CompuChip 15.11.2013 09:34
quelle